Revision 45716169
Added by Andreas Kohlbecker over 9 years ago
.gitattributes | ||
---|---|---|
1268 | 1268 |
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/wizard/VocabularyTermWizardPage.java -text |
1269 | 1269 |
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/security/PermissionPropertyTester.java -text |
1270 | 1270 |
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/security/RequiredPermissions.java -text |
1271 |
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/security/RolesSourceProvider.java -text |
|
1271 | 1272 |
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/store/CdmStore.java -text |
1272 | 1273 |
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/store/CdmStoreConnector.java -text |
1273 | 1274 |
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/store/ContextManager.java -text |
eu.etaxonomy.taxeditor.cdmlib/META-INF/MANIFEST.MF | ||
---|---|---|
346 | 346 |
org.springframework.orm.hibernate4, |
347 | 347 |
org.springframework.security.access, |
348 | 348 |
org.springframework.security.authentication, |
349 |
org.springframework.security.authentication.event, |
|
349 | 350 |
org.springframework.security.core, |
350 | 351 |
org.springframework.security.core.context, |
351 | 352 |
org.springframework.security.core.userdetails, |
eu.etaxonomy.taxeditor.store/META-INF/MANIFEST.MF | ||
---|---|---|
46 | 46 |
eu.etaxonomy.taxeditor.ui.section.supplemental, |
47 | 47 |
eu.etaxonomy.taxeditor.ui.section.taxon, |
48 | 48 |
eu.etaxonomy.taxeditor.ui.selection, |
49 |
eu.etaxonomy.taxeditor.utility, |
|
49 | 50 |
eu.etaxonomy.taxeditor.view, |
50 | 51 |
eu.etaxonomy.taxeditor.view.datasource, |
51 | 52 |
eu.etaxonomy.taxeditor.view.datasource.handler, |
eu.etaxonomy.taxeditor.store/plugin.xml | ||
---|---|---|
963 | 963 |
</definition> |
964 | 964 |
<definition |
965 | 965 |
id="hasROLE_USER_MANAGER"> |
966 |
<test |
|
967 |
args="ROLE_USER_MANAGER" |
|
968 |
property="eu.etaxonomy.taxeditor.security.permissionTester.hasRole"> |
|
969 |
</test> |
|
966 |
<with |
|
967 |
variable="eu.etaxonomy.taxeditor.security.userRoles"> |
|
968 |
<iterate |
|
969 |
ifEmpty="false" |
|
970 |
operator="or"> |
|
971 |
<or> |
|
972 |
<equals |
|
973 |
value="ROLE_ADMIN"> |
|
974 |
</equals> |
|
975 |
<equals |
|
976 |
value="ROLE_USER_MANAGER"> |
|
977 |
</equals> |
|
978 |
</or> |
|
979 |
</iterate> |
|
980 |
</with> |
|
981 |
</definition> |
|
982 |
<definition |
|
983 |
id="hasROLE_PROJECT_MANAGER"> |
|
984 |
<with |
|
985 |
variable="eu.etaxonomy.taxeditor.security.userRoles"> |
|
986 |
<iterate |
|
987 |
ifEmpty="false" |
|
988 |
operator="or"> |
|
989 |
<or> |
|
990 |
<equals |
|
991 |
value="ROLE_ADMIN"> |
|
992 |
</equals> |
|
993 |
<equals |
|
994 |
value="ROLE_PROJECT_MANAGER"> |
|
995 |
</equals> |
|
996 |
</or> |
|
997 |
</iterate> |
|
998 |
</with> |
|
970 | 999 |
</definition> |
971 | 1000 |
</extension> |
972 | 1001 |
<extension |
... | ... | |
1027 | 1056 |
activityId="eu.etaxonomy.taxeditor.store.activityUserManagement" |
1028 | 1057 |
pattern="eu\.etaxonomy\.taxeditor\..*/.*.UserManagement"> |
1029 | 1058 |
</activityPatternBinding> |
1059 |
<activityPatternBinding |
|
1060 |
activityId="eu.etaxonomy.taxeditor.store.activityUserManagement" |
|
1061 |
pattern="eu\.etaxonomy\.taxeditor\..*/bulkeditor\.input\.group"> |
|
1062 |
</activityPatternBinding> |
|
1063 |
<activity |
|
1064 |
description="ROLE_PROJECT_MANAGER dependent ui contributions" |
|
1065 |
id="eu.etaxonomy.taxeditor.store.activityProjectManagement" |
|
1066 |
name="ProjectManagement"> |
|
1067 |
<enabledWhen> |
|
1068 |
<reference |
|
1069 |
definitionId="hasROLE_PROJECT_MANAGER"> |
|
1070 |
</reference> |
|
1071 |
</enabledWhen> |
|
1072 |
</activity> |
|
1073 |
<activityPatternBinding |
|
1074 |
activityId="eu.etaxonomy.taxeditor.store.activityProjectManagement" |
|
1075 |
pattern="eu\.etaxonomy\.taxeditor\..*/eu\.etaxonomy\.taxeditor\..*\.definedTerm.*"> |
|
1076 |
</activityPatternBinding> |
|
1077 |
<activityPatternBinding |
|
1078 |
activityId="eu.etaxonomy.taxeditor.store.activityProjectManagement" |
|
1079 |
pattern="eu.etaxonomy.taxeditor.bulkeditor/bulkeditor.menus.openmenu" |
|
1080 |
isEqualityPattern="true"> |
|
1081 |
</activityPatternBinding> |
|
1082 |
</extension> |
|
1083 |
<extension |
|
1084 |
point="org.eclipse.ui.services"> |
|
1085 |
<sourceProvider |
|
1086 |
provider="eu.etaxonomy.taxeditor.security.RolesSourceProvider"> |
|
1087 |
<variable |
|
1088 |
name="eu.etaxonomy.taxeditor.security.userRoles" |
|
1089 |
priorityLevel="workbench"> |
|
1090 |
</variable> |
|
1091 |
</sourceProvider> |
|
1030 | 1092 |
</extension> |
1031 | 1093 |
|
1032 | 1094 |
</plugin> |
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/security/PermissionPropertyTester.java | ||
---|---|---|
1 | 1 |
package eu.etaxonomy.taxeditor.security; |
2 | 2 |
|
3 |
import java.util.ArrayList; |
|
4 | 3 |
import java.util.EnumSet; |
5 |
import java.util.Iterator; |
|
6 | 4 |
import java.util.List; |
7 | 5 |
|
8 |
import javax.management.relation.Role; |
|
9 |
|
|
10 |
import org.apache.commons.lang.StringUtils; |
|
11 | 6 |
import org.eclipse.core.expressions.PropertyTester; |
12 | 7 |
import org.eclipse.jface.viewers.IStructuredSelection; |
13 | 8 |
|
14 | 9 |
import eu.etaxonomy.cdm.model.common.CdmBase; |
15 | 10 |
import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD; |
11 |
import eu.etaxonomy.cdm.persistence.hibernate.permission.CdmAuthority; |
|
16 | 12 |
import eu.etaxonomy.taxeditor.store.CdmStore; |
17 | 13 |
|
14 |
/** |
|
15 |
* Checks if the currently authenticated user for {@link CdmAuthority} assignments. |
|
16 |
* |
|
17 |
* @author andreas |
|
18 |
* |
|
19 |
*/ |
|
18 | 20 |
public class PermissionPropertyTester extends PropertyTester { |
19 | 21 |
|
20 |
private static final String HAS_ROLES = "hasRoles"; |
|
21 | 22 |
private static final String HAS_PERMISSIONS = "hasPermissions"; |
22 | 23 |
|
23 | 24 |
private static final String CREATE = CRUD.CREATE.toString(); |
... | ... | |
29 | 30 |
public boolean test(Object receiver, String property, Object[] args, |
30 | 31 |
Object expectedValue) { |
31 | 32 |
|
32 |
|
|
33 | 33 |
if(property.equals(HAS_PERMISSIONS)){ |
34 |
|
|
35 | 34 |
return checkHasPermission(receiver, args); |
36 | 35 |
} |
37 |
|
|
38 |
if(property.equals(HAS_ROLES)){ |
|
39 |
return checkHasRoles(property, args); |
|
40 |
} |
|
41 | 36 |
|
42 | 37 |
return false; |
43 | 38 |
} |
44 | 39 |
|
45 |
private boolean checkHasRoles(String property, Object[] args) { |
|
46 |
List<Role> roles = new ArrayList<Role>(); |
|
47 |
for(int i = 0; i < args.length; i++){ |
|
48 |
roles.add((Role)args[i]); |
|
49 |
} |
|
50 |
// return CdmStore.currentAuthentiationHasOneOfRoles(roles.get(0)); // FIXME |
|
51 |
return false; |
|
52 |
|
|
53 |
} |
|
54 |
|
|
55 | 40 |
private boolean checkHasPermission(Object receiver, Object[] args) { |
56 | 41 |
EnumSet<CRUD> crudSet = crudSetFromArgs(args); |
57 | 42 |
|
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/security/RolesSourceProvider.java | ||
---|---|---|
1 |
package eu.etaxonomy.taxeditor.security; |
|
2 |
|
|
3 |
import java.util.ArrayList; |
|
4 |
import java.util.Collection; |
|
5 |
import java.util.HashMap; |
|
6 |
import java.util.List; |
|
7 |
import java.util.Map; |
|
8 |
import java.util.Observable; |
|
9 |
import java.util.Observer; |
|
10 |
|
|
11 |
import org.eclipse.ui.AbstractSourceProvider; |
|
12 |
import org.eclipse.ui.ISources; |
|
13 |
import org.springframework.security.core.Authentication; |
|
14 |
import org.springframework.security.core.GrantedAuthority; |
|
15 |
|
|
16 |
import eu.etaxonomy.cdm.persistence.hibernate.permission.Role; |
|
17 |
import eu.etaxonomy.taxeditor.store.CdmStore; |
|
18 |
import eu.etaxonomy.taxeditor.store.LoginManager; |
|
19 |
|
|
20 |
/** |
|
21 |
* Provides the Roles assigned to the currently authenticated principal as the |
|
22 |
* variable {@code eu.etaxonomy.taxeditor.security.userRoles} |
|
23 |
* |
|
24 |
* @author a.kohlbecker |
|
25 |
* |
|
26 |
*/ |
|
27 |
public class RolesSourceProvider extends AbstractSourceProvider implements Observer { |
|
28 |
|
|
29 |
public final static String RIGHTS_VARIABLE = "eu.etaxonomy.taxeditor.security.userRoles"; |
|
30 |
private final static String[] PROVIDED_SOURCE_NAMES = new String[] { RIGHTS_VARIABLE }; |
|
31 |
|
|
32 |
private final static Map<String, List<String>> stateMap = new HashMap<String, List<String>>(); |
|
33 |
|
|
34 |
public RolesSourceProvider() { |
|
35 |
super(); |
|
36 |
initialize(); |
|
37 |
} |
|
38 |
|
|
39 |
private void initialize() { |
|
40 |
CdmStore.getLoginManager().addObserver(this); |
|
41 |
} |
|
42 |
|
|
43 |
@Override |
|
44 |
public void dispose() { |
|
45 |
CdmStore.getLoginManager().deleteObserver(this); |
|
46 |
} |
|
47 |
|
|
48 |
@Override |
|
49 |
public Map getCurrentState() { |
|
50 |
|
|
51 |
// SecurityContextHolder.getContext(). |
|
52 |
List<Role> roles = getCurrentAuthenticationsRoles(); |
|
53 |
List<String> rolesStr = new ArrayList<String>(roles.size()); |
|
54 |
for(Role r : roles){ |
|
55 |
rolesStr.add(r.getAuthority()); |
|
56 |
} |
|
57 |
|
|
58 |
stateMap.put(RIGHTS_VARIABLE, rolesStr); |
|
59 |
return stateMap; |
|
60 |
} |
|
61 |
|
|
62 |
/* |
|
63 |
* TODO refactor into User once Role is a model class |
|
64 |
*/ |
|
65 |
private List<Role> getCurrentAuthenticationsRoles() { |
|
66 |
|
|
67 |
List<Role> roles = new ArrayList<Role>(); |
|
68 |
Authentication authentication = CdmStore.getCurrentAuthentiation(); |
|
69 |
if (authentication == null) { |
|
70 |
return roles; |
|
71 |
} |
|
72 |
|
|
73 |
Collection<? extends GrantedAuthority> authorities = authentication |
|
74 |
.getAuthorities(); |
|
75 |
if (authorities == null) { |
|
76 |
return roles; |
|
77 |
} |
|
78 |
|
|
79 |
Role role = null; |
|
80 |
for (GrantedAuthority ga : authorities) { |
|
81 |
try { |
|
82 |
// check if it is a valid role |
|
83 |
role = Role.fromString(ga.getAuthority()); |
|
84 |
if (role != null) { |
|
85 |
roles.add(role); |
|
86 |
} |
|
87 |
} catch (Exception e) { |
|
88 |
/* IGNORE */ |
|
89 |
} |
|
90 |
} |
|
91 |
return roles; |
|
92 |
|
|
93 |
} |
|
94 |
|
|
95 |
public String[] getProvidedSourceNames() { |
|
96 |
return PROVIDED_SOURCE_NAMES; |
|
97 |
} |
|
98 |
|
|
99 |
@Override |
|
100 |
public void update(Observable o, Object arg) { |
|
101 |
if(o instanceof LoginManager){ |
|
102 |
/* |
|
103 |
* This triggers an update of the variable state, and will update also |
|
104 |
* all listeners to the evaluation service. So that every menu point, |
|
105 |
* which is also expression controlled, gets updated too. |
|
106 |
*/ |
|
107 |
fireSourceChanged(ISources.WORKBENCH, getCurrentState()); |
|
108 |
} |
|
109 |
} |
|
110 |
|
|
111 |
} |
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/store/CdmStore.java | ||
---|---|---|
21 | 21 |
import org.springframework.core.io.Resource; |
22 | 22 |
import org.springframework.security.access.PermissionEvaluator; |
23 | 23 |
import org.springframework.security.authentication.ProviderManager; |
24 |
import org.springframework.security.core.Authentication; |
|
24 | 25 |
import org.springframework.security.core.context.SecurityContext; |
25 | 26 |
import org.springframework.security.core.context.SecurityContextHolder; |
26 | 27 |
|
... | ... | |
348 | 349 |
* @return |
349 | 350 |
*/ |
350 | 351 |
public static boolean currentAuthentiationHasPermission(Class<? extends CdmBase> targetType, EnumSet<CRUD> permission){ |
351 |
SecurityContext context = SecurityContextHolder.getContext(); |
|
352 |
return getPermissionEvaluator().hasPermission(context.getAuthentication(), null, targetType.getName(), permission); |
|
352 |
return getPermissionEvaluator().hasPermission(getCurrentAuthentiation(), null, targetType.getName(), permission); |
|
353 | 353 |
} |
354 | 354 |
|
355 | 355 |
public static boolean currentAuthentiationHasOneOfRoles(Role ... roles){ |
356 |
return getPermissionEvaluator().hasOneOfRoles(getCurrentAuthentiation(), roles); |
|
357 |
} |
|
358 |
|
|
359 |
public static Authentication getCurrentAuthentiation() { |
|
356 | 360 |
SecurityContext context = SecurityContextHolder.getContext(); |
357 |
return getPermissionEvaluator().hasOneOfRoles(context.getAuthentication(), roles);
|
|
361 |
return context.getAuthentication();
|
|
358 | 362 |
} |
359 | 363 |
|
360 | 364 |
/* |
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/store/LoginManager.java | ||
---|---|---|
52 | 52 |
* <p>authenticate</p> |
53 | 53 |
* |
54 | 54 |
* @param token a {@link org.springframework.security.authentication.UsernamePasswordAuthenticationToken} object. |
55 |
* @return true if the login attempt was successful even if the authentication has changed or not |
|
55 | 56 |
*/ |
56 | 57 |
public boolean authenticate(String username, String password){ |
57 | 58 |
|
... | ... | |
67 | 68 |
|
68 | 69 |
SecurityContextHolder.clearContext(); |
69 | 70 |
|
71 |
Authentication lastAuthentication = CdmStore.getCurrentAuthentiation(); |
|
72 |
|
|
70 | 73 |
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password); |
71 | 74 |
Authentication authentication = CdmStore.getAuthenticationManager().authenticate(token); |
72 | 75 |
|
... | ... | |
89 | 92 |
|
90 | 93 |
SecurityContextHolder.getContext().setAuthentication(authentication); |
91 | 94 |
|
92 |
this.setChanged(); |
|
93 |
this.notifyObservers(); |
|
95 |
if(!authentication.equals(lastAuthentication)){ |
|
96 |
this.setChanged(); |
|
97 |
this.notifyObservers(); |
|
98 |
} |
|
94 | 99 |
return true; |
95 | 100 |
} |
96 | 101 |
catch(BadCredentialsException e){ |
Also available in: Unified diff
RolesSourceProvider to enable activities by cdm roles and protecting bulkeditors and term editors - #4055 (action enablement adapts to the users granted authorities)