Skip to content

Commit 8a66d0c

Browse files
committed
Polish PermissionEvaluator Autowired into Web Security
Issue gh-4077
1 parent 3bf6bf1 commit 8a66d0c

File tree

2 files changed

+6
-33
lines changed

2 files changed

+6
-33
lines changed

config/src/main/java/org/springframework/security/config/annotation/web/configurers/ExpressionUrlAuthorizationConfigurer.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.springframework.http.HttpMethod;
2525
import org.springframework.security.access.AccessDecisionVoter;
2626
import org.springframework.security.access.ConfigAttribute;
27+
import org.springframework.security.access.PermissionEvaluator;
2728
import org.springframework.security.access.SecurityConfig;
2829
import org.springframework.security.access.expression.SecurityExpressionHandler;
2930
import org.springframework.security.access.hierarchicalroles.RoleHierarchy;
@@ -222,6 +223,11 @@ private SecurityExpressionHandler<FilterInvocation> getExpressionHandler(H http)
222223
GrantedAuthorityDefaults grantedAuthorityDefaults = context.getBean(grantedAuthorityDefaultsBeanNames[0], GrantedAuthorityDefaults.class);
223224
defaultHandler.setDefaultRolePrefix(grantedAuthorityDefaults.getRolePrefix());
224225
}
226+
String[] permissionEvaluatorBeanNames = context.getBeanNamesForType(PermissionEvaluator.class);
227+
if(permissionEvaluatorBeanNames.length == 1) {
228+
PermissionEvaluator permissionEvaluator = context.getBean(permissionEvaluatorBeanNames[0], PermissionEvaluator.class);
229+
defaultHandler.setPermissionEvaluator(permissionEvaluator);
230+
}
225231
}
226232

227233
expressionHandler = postProcess(defaultHandler);

core/src/main/java/org/springframework/security/access/expression/AbstractSecurityExpressionHandler.java

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,8 @@ public abstract class AbstractSecurityExpressionHandler<T> implements
4040
SecurityExpressionHandler<T>, ApplicationContextAware {
4141
private ExpressionParser expressionParser = new SpelExpressionParser();
4242
private BeanResolver br;
43-
private ApplicationContext context;
4443
private RoleHierarchy roleHierarchy;
4544
private PermissionEvaluator permissionEvaluator = new DenyAllPermissionEvaluator();
46-
private boolean roleHierarchySet = false;
47-
private boolean permissionEvaluatorSet = false;
48-
4945

5046
public final ExpressionParser getExpressionParser() {
5147
return expressionParser;
@@ -105,52 +101,23 @@ protected StandardEvaluationContext createEvaluationContextInternal(
105101
protected abstract SecurityExpressionOperations createSecurityExpressionRoot(
106102
Authentication authentication, T invocation);
107103

108-
private boolean roleHerarchyNotSetForValidContext() {
109-
return ! roleHierarchySet && context != null;
110-
}
111-
112104
protected RoleHierarchy getRoleHierarchy() {
113-
if(roleHerarchyNotSetForValidContext()) {
114-
RoleHierarchy contextRoleHierarchy = getSingleBeanOrNull(RoleHierarchy.class);
115-
if(contextRoleHierarchy != null){
116-
roleHierarchy = contextRoleHierarchy;
117-
}
118-
roleHierarchySet = true;
119-
}
120105
return roleHierarchy;
121106
}
122107

123108
public void setRoleHierarchy(RoleHierarchy roleHierarchy) {
124-
roleHierarchySet = true;
125109
this.roleHierarchy = roleHierarchy;
126110
}
127111

128112
protected PermissionEvaluator getPermissionEvaluator() {
129-
if(! permissionEvaluatorSet && context != null) {
130-
PermissionEvaluator contextPermissionEvaluator = getSingleBeanOrNull(PermissionEvaluator.class);
131-
if(contextPermissionEvaluator != null){
132-
permissionEvaluator = contextPermissionEvaluator;
133-
}
134-
permissionEvaluatorSet = true;
135-
}
136113
return permissionEvaluator;
137114
}
138115

139116
public void setPermissionEvaluator(PermissionEvaluator permissionEvaluator) {
140-
permissionEvaluatorSet = true;
141117
this.permissionEvaluator = permissionEvaluator;
142118
}
143119

144120
public void setApplicationContext(ApplicationContext applicationContext) {
145121
br = new BeanFactoryResolver(applicationContext);
146-
this.context = applicationContext;
147-
}
148-
149-
private <T> T getSingleBeanOrNull(Class<T> type) {
150-
String[] beanNamesForType = context.getBeanNamesForType(type);
151-
if (beanNamesForType == null || beanNamesForType.length != 1) {
152-
return null;
153-
}
154-
return context.getBean(beanNamesForType[0], type);
155122
}
156123
}

0 commit comments

Comments
 (0)