Skip to content

Commit 8469ddf

Browse files
committed
Use PermissionEvaluator
Closes gh-15715
1 parent add5c56 commit 8469ddf

File tree

4 files changed

+44
-1
lines changed

4 files changed

+44
-1
lines changed

config/src/main/java/org/springframework/security/config/annotation/method/configuration/ReactiveAuthorizationManagerMethodSecurityConfiguration.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.springframework.context.annotation.Bean;
3636
import org.springframework.context.annotation.Configuration;
3737
import org.springframework.context.annotation.Role;
38+
import org.springframework.security.access.PermissionEvaluator;
3839
import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler;
3940
import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler;
4041
import org.springframework.security.authentication.ReactiveAuthenticationManager;
@@ -115,11 +116,13 @@ static MethodInterceptor postAuthorizeAuthorizationMethodInterceptor(
115116
@Bean
116117
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
117118
static DefaultMethodSecurityExpressionHandler methodSecurityExpressionHandler(
118-
@Autowired(required = false) GrantedAuthorityDefaults grantedAuthorityDefaults) {
119+
@Autowired(required = false) GrantedAuthorityDefaults grantedAuthorityDefaults,
120+
ObjectProvider<PermissionEvaluator> permissionEvaluator) {
119121
DefaultMethodSecurityExpressionHandler handler = new DefaultMethodSecurityExpressionHandler();
120122
if (grantedAuthorityDefaults != null) {
121123
handler.setDefaultRolePrefix(grantedAuthorityDefaults.getRolePrefix());
122124
}
125+
permissionEvaluator.ifAvailable(handler::setPermissionEvaluator);
123126
return handler;
124127
}
125128

config/src/test/java/org/springframework/security/config/annotation/method/configuration/PrePostReactiveMethodSecurityConfigurationTests.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,23 @@
1616

1717
package org.springframework.security.config.annotation.method.configuration;
1818

19+
import java.io.Serializable;
20+
1921
import org.junit.jupiter.api.Test;
2022
import org.junit.jupiter.api.extension.ExtendWith;
2123
import reactor.test.StepVerifier;
2224

2325
import org.springframework.context.annotation.Bean;
2426
import org.springframework.context.annotation.Configuration;
27+
import org.springframework.security.access.PermissionEvaluator;
2528
import org.springframework.security.config.test.SpringTestContext;
2629
import org.springframework.security.config.test.SpringTestContextExtension;
30+
import org.springframework.security.core.Authentication;
2731
import org.springframework.security.test.context.annotation.SecurityTestExecutionListeners;
2832
import org.springframework.security.test.context.support.WithMockUser;
2933
import org.springframework.test.context.junit.jupiter.SpringExtension;
3034

35+
3136
@ExtendWith({ SpringExtension.class, SpringTestContextExtension.class })
3237
@SecurityTestExecutionListeners
3338
public class PrePostReactiveMethodSecurityConfigurationTests {
@@ -201,6 +206,14 @@ void preAuthorizeWhenAllowedAndHandlerWithCustomAnnotationUsingBeanThenInvokeMet
201206
StepVerifier.create(service.preAuthorizeWithMaskAnnotationUsingBean()).expectNext("ok").verifyComplete();
202207
}
203208

209+
@Test
210+
@WithMockUser(roles = "ADMIN")
211+
public void methodSecurityExpressionHandlerWhenPermissionEvaluatorBeanAvailableThenUses() {
212+
this.spring.register(MethodSecurityServiceEnabledConfig.class, PermissionEvaluatorConfig.class).autowire();
213+
ReactiveMethodSecurityService service = this.spring.getContext().getBean(ReactiveMethodSecurityService.class);
214+
StepVerifier.create(service.preAuthorizeHasPermission("Hello")).expectNext("ok").verifyComplete();
215+
}
216+
204217
@Configuration
205218
@EnableReactiveMethodSecurity
206219
static class MethodSecurityServiceEnabledConfig {
@@ -212,4 +225,24 @@ ReactiveMethodSecurityService methodSecurityService() {
212225

213226
}
214227

228+
@Configuration
229+
static class PermissionEvaluatorConfig {
230+
231+
@Bean
232+
PermissionEvaluator permissionEvaluator() {
233+
return new PermissionEvaluator() {
234+
@Override
235+
public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) {
236+
return true;
237+
}
238+
239+
@Override
240+
public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) {
241+
return true;
242+
}
243+
};
244+
}
245+
246+
}
247+
215248
}

config/src/test/java/org/springframework/security/config/annotation/method/configuration/ReactiveMethodSecurityService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,9 @@ public interface ReactiveMethodSecurityService {
101101
@HandleAuthorizationDenied(handlerClass = MethodAuthorizationDeniedHandler.class)
102102
Mono<String> checkCustomResult(boolean result);
103103

104+
@PreAuthorize("hasPermission('#kgName', 'read')")
105+
Mono<String> preAuthorizeHasPermission(String kgName);
106+
104107
class StarMaskingHandler implements MethodAuthorizationDeniedHandler {
105108

106109
@Override

config/src/test/java/org/springframework/security/config/annotation/method/configuration/ReactiveMethodSecurityServiceImpl.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,4 +88,8 @@ public Mono<String> checkCustomResult(boolean result) {
8888
return Mono.just("ok");
8989
}
9090

91+
@Override
92+
public Mono<String> preAuthorizeHasPermission(String kgName) {
93+
return Mono.just("ok");
94+
}
9195
}

0 commit comments

Comments
 (0)