Skip to content

Commit eb067bc

Browse files
committed
DefaultWebSecurityExpressionHandler uses PermissionEvaluator Bean
The default instance of DefaultWebSecurityExpressionHandler uses the PermissionEvaluator Bean by default. Fixes: gh-5272
1 parent 359a73e commit eb067bc

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

config/src/main/java/org/springframework/security/config/annotation/web/builders/WebSecurity.java

+6
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.springframework.context.ApplicationContext;
3030
import org.springframework.context.ApplicationContextAware;
3131
import org.springframework.http.HttpMethod;
32+
import org.springframework.security.access.PermissionEvaluator;
3233
import org.springframework.security.access.expression.SecurityExpressionHandler;
3334
import org.springframework.security.config.annotation.AbstractConfiguredSecurityBuilder;
3435
import org.springframework.security.config.annotation.ObjectPostProcessor;
@@ -384,6 +385,11 @@ public void setApplicationContext(ApplicationContext applicationContext)
384385
throws BeansException {
385386
this.defaultWebSecurityExpressionHandler
386387
.setApplicationContext(applicationContext);
388+
try {
389+
this.defaultWebSecurityExpressionHandler.setPermissionEvaluator(applicationContext.getBean(
390+
PermissionEvaluator.class));
391+
} catch(NoSuchBeanDefinitionException e) {}
392+
387393
this.ignoredRequestRegistry = new IgnoredRequestConfigurer(applicationContext);
388394
try {
389395
this.httpFirewall = applicationContext.getBean(HttpFirewall.class);

config/src/test/java/org/springframework/security/config/annotation/web/configuration/WebSecurityConfigurationTests.java

+46
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,24 @@
2323
import org.springframework.context.annotation.Configuration;
2424
import org.springframework.context.annotation.Import;
2525
import org.springframework.core.annotation.Order;
26+
import org.springframework.expression.EvaluationContext;
27+
import org.springframework.expression.Expression;
2628
import org.springframework.expression.ExpressionParser;
29+
import org.springframework.mock.web.MockFilterChain;
2730
import org.springframework.mock.web.MockHttpServletRequest;
31+
import org.springframework.mock.web.MockHttpServletResponse;
32+
import org.springframework.security.access.PermissionEvaluator;
33+
import org.springframework.security.access.expression.AbstractSecurityExpressionHandler;
2834
import org.springframework.security.access.expression.SecurityExpressionHandler;
35+
import org.springframework.security.authentication.TestingAuthenticationToken;
2936
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
3037
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
3138
import org.springframework.security.config.annotation.web.builders.WebSecurity;
3239
import org.springframework.security.config.test.SpringTestRule;
3340
import org.springframework.security.config.users.AuthenticationTestConfiguration;
41+
import org.springframework.security.core.Authentication;
3442
import org.springframework.security.web.FilterChainProxy;
43+
import org.springframework.security.web.FilterInvocation;
3544
import org.springframework.security.web.SecurityFilterChain;
3645
import org.springframework.security.web.access.DefaultWebInvocationPrivilegeEvaluator;
3746
import org.springframework.security.web.access.WebInvocationPrivilegeEvaluator;
@@ -41,6 +50,7 @@
4150
import org.springframework.web.bind.annotation.GetMapping;
4251
import org.springframework.web.bind.annotation.RestController;
4352

53+
import java.io.Serializable;
4454
import java.lang.reflect.Method;
4555
import java.lang.reflect.Modifier;
4656
import java.util.List;
@@ -260,6 +270,42 @@ protected void configure(HttpSecurity http) throws Exception {
260270
}
261271
}
262272

273+
@Test
274+
public void securityExpressionHandlerWhenPermissionEvaluatorBeanThenPermissionEvaluatorUsed() throws Exception {
275+
this.spring.register(WebSecurityExpressionHandlerPermissionEvaluatorBeanConfig.class).autowire();
276+
TestingAuthenticationToken authentication = new TestingAuthenticationToken("user", "notused");
277+
FilterInvocation invocation = new FilterInvocation(new MockHttpServletRequest(), new MockHttpServletResponse(), new MockFilterChain());
278+
279+
AbstractSecurityExpressionHandler handler = this.spring.getContext().getBean(AbstractSecurityExpressionHandler.class);
280+
EvaluationContext evaluationContext = handler.createEvaluationContext(authentication, invocation);
281+
Expression expression = handler.getExpressionParser()
282+
.parseExpression("hasPermission(#study,'DELETE')");
283+
boolean granted = expression.getValue(evaluationContext, Boolean.class);
284+
assertThat(granted).isTrue();
285+
}
286+
287+
@EnableWebSecurity
288+
static class WebSecurityExpressionHandlerPermissionEvaluatorBeanConfig extends WebSecurityConfigurerAdapter {
289+
static final PermissionEvaluator PERMIT_ALL_PERMISSION_EVALUATOR = new PermissionEvaluator() {
290+
@Override
291+
public boolean hasPermission(Authentication authentication,
292+
Object targetDomainObject, Object permission) {
293+
return true;
294+
}
295+
296+
@Override
297+
public boolean hasPermission(Authentication authentication,
298+
Serializable targetId, String targetType, Object permission) {
299+
return true;
300+
}
301+
};
302+
303+
@Bean
304+
public PermissionEvaluator permissionEvaluator() {
305+
return PERMIT_ALL_PERMISSION_EVALUATOR;
306+
}
307+
}
308+
263309
@Test
264310
public void loadConfigWhenDefaultWebInvocationPrivilegeEvaluatorThenDefaultIsRegistered() throws Exception {
265311
this.spring.register(WebInvocationPrivilegeEvaluatorDefaultsConfig.class).autowire();

0 commit comments

Comments
 (0)