]> git.aero2k.de Git - tmp/jakarta-migration.git/blob
8c53fd96cd25cb854f1b278aaedb71f53cb4c175
[tmp/jakarta-migration.git] /
1 /**
2  *  This document is a part of the source code and related artifacts
3  *  for CollectionSpace, an open source collections management system
4  *  for museums and related institutions:
5
6  *  http://www.collectionspace.org
7  *  http://wiki.collectionspace.org
8
9  *  Copyright 2009 University of California at Berkeley
10
11  *  Licensed under the Educational Community License (ECL), Version 2.0.
12  *  You may not use this file except in compliance with this License.
13
14  *  You may obtain a copy of the ECL 2.0 License at
15
16  *  https://source.collectionspace.org/collection-space/LICENSE.txt
17
18  *  Unless required by applicable law or agreed to in writing, software
19  *  distributed under the License is distributed on an "AS IS" BASIS,
20  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21  *  See the License for the specific language governing permissions and
22  *  limitations under the License.
23  */
24 package org.collectionspace.services.authorization.spring;
25
26 import java.util.ArrayList;
27 import org.apache.commons.logging.Log;
28 import org.apache.commons.logging.LogFactory;
29 import org.collectionspace.services.authorization.CSpaceAction;
30 import org.collectionspace.services.authorization.CSpaceResource;
31 import org.collectionspace.services.authorization.spi.CSpaceAuthorizationProvider;
32 import org.collectionspace.services.authorization.spi.CSpacePermissionEvaluator;
33 import org.collectionspace.services.authorization.spi.CSpacePermissionManager;
34 import org.springframework.beans.factory.annotation.Autowired;
35 import org.springframework.jdbc.datasource.DataSourceTransactionManager;
36 import org.springframework.security.access.PermissionEvaluator;
37 import org.springframework.security.acls.domain.BasePermission;
38 import org.springframework.security.acls.domain.GrantedAuthoritySid;
39 import org.springframework.security.acls.domain.ObjectIdentityImpl;
40 import org.springframework.security.acls.model.MutableAclService;
41 import org.springframework.security.acls.model.ObjectIdentity;
42 import org.springframework.security.acls.model.Permission;
43 import org.springframework.security.acls.model.Sid;
44 import org.springframework.transaction.TransactionDefinition;
45 import org.springframework.transaction.TransactionStatus;
46 import org.springframework.transaction.support.DefaultTransactionDefinition;
47
48 /**
49  * SpringAuthorizationProvider Spring Security provider
50  * @author 
51  */
52 public class SpringAuthorizationProvider implements CSpaceAuthorizationProvider {
53
54     final Log log = LogFactory.getLog(SpringPermissionEvaluator.class);
55     @Autowired
56     private MutableAclService providerAclService;
57     @Autowired
58     private PermissionEvaluator providerPermissionEvaluator;
59     @Autowired
60     private DataSourceTransactionManager txManager;
61     private SpringPermissionEvaluator permissionEvaluator;
62     private SpringPermissionManager permissionManager;
63     private String version = "1.0";
64
65     public SpringAuthorizationProvider() {
66         permissionManager = new SpringPermissionManager(this);
67         permissionEvaluator = new SpringPermissionEvaluator(this);
68     }
69
70     MutableAclService getProviderAclService() {
71         return providerAclService;
72     }
73
74     public void setProviderAclService(MutableAclService mutableAclService) {
75         this.providerAclService = mutableAclService;
76         if (log.isDebugEnabled()) {
77             log.debug("mutableAclService set");
78         }
79     }
80
81     @Override
82     public String getName() {
83         return this.getClass().getSimpleName();
84     }
85
86     @Override
87     public String getVersion() {
88         return version;
89     }
90
91     PermissionEvaluator getProviderPermissionEvaluator() {
92         return providerPermissionEvaluator;
93     }
94
95     public void setProviderPermissionEvaluator(PermissionEvaluator permEval) {
96         this.providerPermissionEvaluator = permEval;
97         if (log.isDebugEnabled()) {
98             log.debug("permission evaluator set");
99         }
100     }
101
102     @Override
103     public CSpacePermissionEvaluator getPermissionEvaluator() {
104         return permissionEvaluator;
105     }
106
107     @Override
108     public CSpacePermissionManager getPermissionManager() {
109         return permissionManager;
110     }
111
112     static ObjectIdentity mapResource(CSpaceResource res) {
113         return new ObjectIdentityImpl(res.getType().toString(),
114                 Long.valueOf(res.getId().hashCode()));
115     }
116
117     static Sid[] mapPrincipal(String[] principals) {
118         ArrayList<Sid> sids = new ArrayList<Sid>();
119         for (String principal : principals) {
120             sids.add(new GrantedAuthoritySid(principal));
121         }
122         return sids.toArray(new Sid[0]);
123     }
124
125     static Permission mapPermssion(CSpaceAction perm) {
126         switch (perm) {
127             case ADMIN:
128                 return BasePermission.ADMINISTRATION;
129             case CREATE:
130                 return BasePermission.CREATE;
131             case READ:
132             case SEARCH:
133                 return BasePermission.READ;
134             case UPDATE:
135                 return BasePermission.WRITE;
136             case DELETE:
137                 return BasePermission.DELETE;
138         }
139         return null;
140     }
141
142     /**
143      * @return the txManager
144      */
145     DataSourceTransactionManager getTxManager() {
146         return txManager;
147     }
148
149     /**
150      * @param txManager the txManager to set
151      */
152     public void setTxManager(DataSourceTransactionManager txManager) {
153         this.txManager = txManager;
154     }
155
156     TransactionStatus beginTransaction(String name) {
157         DefaultTransactionDefinition def = new DefaultTransactionDefinition();
158         // explicitly setting the transaction name is something that can only be done programmatically
159         def.setName(name);
160         def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
161         return getTxManager().getTransaction(def);
162     }
163
164     void rollbackTransaction(TransactionStatus status) {
165         getTxManager().rollback(status);
166     }
167
168     void commitTransaction(TransactionStatus status) {
169         getTxManager().commit(status);
170     }
171 }