|
23 | 23 | import org.springframework.context.annotation.Configuration;
|
24 | 24 | import org.springframework.context.annotation.Import;
|
25 | 25 | import org.springframework.core.annotation.Order;
|
| 26 | +import org.springframework.expression.EvaluationContext; |
| 27 | +import org.springframework.expression.Expression; |
26 | 28 | import org.springframework.expression.ExpressionParser;
|
| 29 | +import org.springframework.mock.web.MockFilterChain; |
27 | 30 | 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; |
28 | 34 | import org.springframework.security.access.expression.SecurityExpressionHandler;
|
| 35 | +import org.springframework.security.authentication.TestingAuthenticationToken; |
29 | 36 | import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
|
30 | 37 | import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
31 | 38 | import org.springframework.security.config.annotation.web.builders.WebSecurity;
|
32 | 39 | import org.springframework.security.config.test.SpringTestRule;
|
33 | 40 | import org.springframework.security.config.users.AuthenticationTestConfiguration;
|
| 41 | +import org.springframework.security.core.Authentication; |
34 | 42 | import org.springframework.security.web.FilterChainProxy;
|
| 43 | +import org.springframework.security.web.FilterInvocation; |
35 | 44 | import org.springframework.security.web.SecurityFilterChain;
|
36 | 45 | import org.springframework.security.web.access.DefaultWebInvocationPrivilegeEvaluator;
|
37 | 46 | import org.springframework.security.web.access.WebInvocationPrivilegeEvaluator;
|
|
41 | 50 | import org.springframework.web.bind.annotation.GetMapping;
|
42 | 51 | import org.springframework.web.bind.annotation.RestController;
|
43 | 52 |
|
| 53 | +import java.io.Serializable; |
44 | 54 | import java.lang.reflect.Method;
|
45 | 55 | import java.lang.reflect.Modifier;
|
46 | 56 | import java.util.List;
|
@@ -260,6 +270,42 @@ protected void configure(HttpSecurity http) throws Exception {
|
260 | 270 | }
|
261 | 271 | }
|
262 | 272 |
|
| 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 | + |
263 | 309 | @Test
|
264 | 310 | public void loadConfigWhenDefaultWebInvocationPrivilegeEvaluatorThenDefaultIsRegistered() throws Exception {
|
265 | 311 | this.spring.register(WebInvocationPrivilegeEvaluatorDefaultsConfig.class).autowire();
|
|
0 commit comments