Configure permissionEvaluator and roleHierarchy by default
Implementations of AbstractSecurityExpressionHandler (such as the very commonly used DefaultWebSecurityExpressionHandler) get PermissionEvaluator and RoleHierarchy from the application context (if the application context is provided, and exactly one of such a bean exists in it). This approach matches that used in GlobalMethodSecurityConfiguration, making everything in Spring Security work the same way (including WebSecurity). Issue gh-4077
This commit is contained in:
+33
@@ -40,8 +40,12 @@ public abstract class AbstractSecurityExpressionHandler<T> implements
|
||||
SecurityExpressionHandler<T>, ApplicationContextAware {
|
||||
private ExpressionParser expressionParser = new SpelExpressionParser();
|
||||
private BeanResolver br;
|
||||
private ApplicationContext context;
|
||||
private RoleHierarchy roleHierarchy;
|
||||
private PermissionEvaluator permissionEvaluator = new DenyAllPermissionEvaluator();
|
||||
private boolean roleHierarchySet = false;
|
||||
private boolean permissionEvaluatorSet = false;
|
||||
|
||||
|
||||
public final ExpressionParser getExpressionParser() {
|
||||
return expressionParser;
|
||||
@@ -101,23 +105,52 @@ public abstract class AbstractSecurityExpressionHandler<T> implements
|
||||
protected abstract SecurityExpressionOperations createSecurityExpressionRoot(
|
||||
Authentication authentication, T invocation);
|
||||
|
||||
private boolean roleHerarchyNotSetForValidContext() {
|
||||
return ! roleHierarchySet && context != null;
|
||||
}
|
||||
|
||||
protected RoleHierarchy getRoleHierarchy() {
|
||||
if(roleHerarchyNotSetForValidContext()) {
|
||||
RoleHierarchy contextRoleHierarchy = getSingleBeanOrNull(RoleHierarchy.class);
|
||||
if(contextRoleHierarchy != null){
|
||||
roleHierarchy = contextRoleHierarchy;
|
||||
}
|
||||
roleHierarchySet = true;
|
||||
}
|
||||
return roleHierarchy;
|
||||
}
|
||||
|
||||
public void setRoleHierarchy(RoleHierarchy roleHierarchy) {
|
||||
roleHierarchySet = true;
|
||||
this.roleHierarchy = roleHierarchy;
|
||||
}
|
||||
|
||||
protected PermissionEvaluator getPermissionEvaluator() {
|
||||
if(! permissionEvaluatorSet && context != null) {
|
||||
PermissionEvaluator contextPermissionEvaluator = getSingleBeanOrNull(PermissionEvaluator.class);
|
||||
if(contextPermissionEvaluator != null){
|
||||
permissionEvaluator = contextPermissionEvaluator;
|
||||
}
|
||||
permissionEvaluatorSet = true;
|
||||
}
|
||||
return permissionEvaluator;
|
||||
}
|
||||
|
||||
public void setPermissionEvaluator(PermissionEvaluator permissionEvaluator) {
|
||||
permissionEvaluatorSet = true;
|
||||
this.permissionEvaluator = permissionEvaluator;
|
||||
}
|
||||
|
||||
public void setApplicationContext(ApplicationContext applicationContext) {
|
||||
br = new BeanFactoryResolver(applicationContext);
|
||||
this.context = applicationContext;
|
||||
}
|
||||
|
||||
private <T> T getSingleBeanOrNull(Class<T> type) {
|
||||
String[] beanNamesForType = context.getBeanNamesForType(type);
|
||||
if (beanNamesForType == null || beanNamesForType.length != 1) {
|
||||
return null;
|
||||
}
|
||||
return context.getBean(beanNamesForType[0], type);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user