Skip to content

Commit f7f6798

Browse files
committed
DefaultWebSecurityExpressionHandler uses PermissionEvaluator Bean
The default instance of DefaultWebSecurityExpressionHandler uses the PermissionEvaluator Bean by default. Fixes: gh-5272
1 parent 0b72f93 commit f7f6798

File tree

2 files changed

+64
-12
lines changed

2 files changed

+64
-12
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;
@@ -382,6 +383,11 @@ public void setApplicationContext(ApplicationContext applicationContext)
382383
throws BeansException {
383384
this.defaultWebSecurityExpressionHandler
384385
.setApplicationContext(applicationContext);
386+
try {
387+
this.defaultWebSecurityExpressionHandler.setPermissionEvaluator(applicationContext.getBean(
388+
PermissionEvaluator.class));
389+
} catch(NoSuchBeanDefinitionException e) {}
390+
385391
this.ignoredRequestRegistry = new IgnoredRequestConfigurer(applicationContext);
386392
try {
387393
this.httpFirewall = applicationContext.getBean(HttpFirewall.class);

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

+58-12
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,19 @@
1515
*/
1616
package org.springframework.security.config.annotation.web.configuration;
1717

18+
import static org.assertj.core.api.Assertions.assertThat;
19+
import static org.assertj.core.api.Assertions.catchThrowable;
20+
import static org.mockito.Mockito.mock;
21+
import static org.mockito.Mockito.when;
22+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
23+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
24+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
25+
26+
import java.io.Serializable;
27+
import java.lang.reflect.Method;
28+
import java.lang.reflect.Modifier;
29+
import java.util.List;
30+
1831
import org.junit.Rule;
1932
import org.junit.Test;
2033
import org.springframework.beans.factory.BeanCreationException;
@@ -23,15 +36,24 @@
2336
import org.springframework.context.annotation.Configuration;
2437
import org.springframework.context.annotation.Import;
2538
import org.springframework.core.annotation.Order;
39+
import org.springframework.expression.EvaluationContext;
40+
import org.springframework.expression.Expression;
2641
import org.springframework.expression.ExpressionParser;
42+
import org.springframework.mock.web.MockFilterChain;
2743
import org.springframework.mock.web.MockHttpServletRequest;
44+
import org.springframework.mock.web.MockHttpServletResponse;
45+
import org.springframework.security.access.PermissionEvaluator;
46+
import org.springframework.security.access.expression.AbstractSecurityExpressionHandler;
2847
import org.springframework.security.access.expression.SecurityExpressionHandler;
48+
import org.springframework.security.authentication.TestingAuthenticationToken;
2949
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
3050
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
3151
import org.springframework.security.config.annotation.web.builders.WebSecurity;
3252
import org.springframework.security.config.test.SpringTestRule;
3353
import org.springframework.security.config.users.AuthenticationTestConfiguration;
54+
import org.springframework.security.core.Authentication;
3455
import org.springframework.security.web.FilterChainProxy;
56+
import org.springframework.security.web.FilterInvocation;
3557
import org.springframework.security.web.SecurityFilterChain;
3658
import org.springframework.security.web.access.DefaultWebInvocationPrivilegeEvaluator;
3759
import org.springframework.security.web.access.WebInvocationPrivilegeEvaluator;
@@ -41,18 +63,6 @@
4163
import org.springframework.web.bind.annotation.GetMapping;
4264
import org.springframework.web.bind.annotation.RestController;
4365

44-
import java.lang.reflect.Method;
45-
import java.lang.reflect.Modifier;
46-
import java.util.List;
47-
48-
import static org.assertj.core.api.Assertions.assertThat;
49-
import static org.assertj.core.api.Assertions.catchThrowable;
50-
import static org.mockito.Mockito.mock;
51-
import static org.mockito.Mockito.when;
52-
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
53-
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
54-
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
55-
5666
/**
5767
* Tests for {@link WebSecurityConfiguration}.
5868
*
@@ -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)