]> git.aero2k.de Git - tmp/jakarta-migration.git/blob
996e879e865651dd6d70714e9c820ec9eb30eb50
[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 Long getObjectIdentityIdentifier(CSpaceResource res) {
113         return Long.valueOf(res.getId().hashCode());
114     }
115
116     static String getObjectIdentityType(CSpaceResource res) {
117         return res.getType().toString();
118     }
119
120     static ObjectIdentity getObjectIdentity(CSpaceResource res) {
121         return new ObjectIdentityImpl(getObjectIdentityType(res),
122                 getObjectIdentityIdentifier(res));
123     }
124
125     static Sid[] getSids(String[] principals) {
126         ArrayList<Sid> sids = new ArrayList<Sid>();
127         for (String principal : principals) {
128             sids.add(new GrantedAuthoritySid(principal));
129         }
130         return sids.toArray(new Sid[0]);
131     }
132
133     static Permission getPermission(CSpaceAction perm) {
134         switch (perm) {
135             case ADMIN:
136                 return BasePermission.ADMINISTRATION;
137             case CREATE:
138                 return BasePermission.CREATE;
139             case READ:
140             case SEARCH:
141                 return BasePermission.READ;
142             case UPDATE:
143                 return BasePermission.WRITE;
144             case DELETE:
145                 return BasePermission.DELETE;
146         }
147         return null;
148     }
149
150     /**
151      * @return the txManager
152      */
153     DataSourceTransactionManager getTxManager() {
154         return txManager;
155     }
156
157     /**
158      * @param txManager the txManager to set
159      */
160     public void setTxManager(DataSourceTransactionManager txManager) {
161         this.txManager = txManager;
162     }
163
164     TransactionStatus beginTransaction(String name) {
165         DefaultTransactionDefinition def = new DefaultTransactionDefinition();
166         // explicitly setting the transaction name is something that can only be done programmatically
167         def.setName(name);
168         def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
169         return getTxManager().getTransaction(def);
170     }
171
172     void rollbackTransaction(TransactionStatus status) {
173         getTxManager().rollback(status);
174     }
175
176     void commitTransaction(TransactionStatus status) {
177         getTxManager().commit(status);
178     }
179 }