Skip to content

Commit 56eb658

Browse files
dongmyorwinch
authored andcommitted
RoleVoter Configuration Defaults Prefix Using GrantedAuthorityDefauts
Fixes: gh-4876
1 parent 12ab2cc commit 56eb658

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

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

+7-1
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,13 @@ protected AccessDecisionManager accessDecisionManager() {
255255
if (jsr250Enabled()) {
256256
decisionVoters.add(new Jsr250Voter());
257257
}
258-
decisionVoters.add(new RoleVoter());
258+
RoleVoter roleVoter = new RoleVoter();
259+
GrantedAuthorityDefaults grantedAuthorityDefaults =
260+
getSingleBeanOrNull(GrantedAuthorityDefaults.class);
261+
if (grantedAuthorityDefaults != null) {
262+
roleVoter.setRolePrefix(grantedAuthorityDefaults.getRolePrefix());
263+
}
264+
decisionVoters.add(roleVoter);
259265
decisionVoters.add(new AuthenticatedVoter());
260266
return new AffirmativeBased(decisionVoters);
261267
}

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

+39
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.springframework.context.annotation.Configuration;
3535
import org.springframework.security.access.AccessDeniedException;
3636
import org.springframework.security.access.PermissionEvaluator;
37+
import org.springframework.security.access.annotation.Secured;
3738
import org.springframework.security.access.hierarchicalroles.RoleHierarchy;
3839
import org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl;
3940
import org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor;
@@ -514,4 +515,42 @@ static class CustomAuthorityService {
514515
public void customPrefixRoleUser() {}
515516
}
516517
}
518+
519+
@Test
520+
@WithMockUser(authorities = "USER")
521+
public void grantedAuthorityDefaultsWithEmptyRolePrefix() {
522+
this.spring.register(EmptyRolePrefixGrantedAuthorityConfig.class).autowire();
523+
524+
EmptyRolePrefixGrantedAuthorityConfig.CustomAuthorityService customService = this.spring.getContext()
525+
.getBean(EmptyRolePrefixGrantedAuthorityConfig.CustomAuthorityService.class);
526+
527+
assertThatThrownBy(() -> this.service.securedUser())
528+
.isInstanceOf(AccessDeniedException.class);
529+
530+
customService.emptyPrefixRoleUser();
531+
// no exception
532+
}
533+
534+
@EnableGlobalMethodSecurity(securedEnabled = true)
535+
static class EmptyRolePrefixGrantedAuthorityConfig {
536+
@Bean
537+
public GrantedAuthorityDefaults ga() {
538+
return new GrantedAuthorityDefaults("");
539+
}
540+
541+
@Bean
542+
public CustomAuthorityService service() {
543+
return new CustomAuthorityService();
544+
}
545+
546+
@Bean
547+
public MethodSecurityServiceImpl methodSecurityService() {
548+
return new MethodSecurityServiceImpl();
549+
}
550+
551+
static class CustomAuthorityService {
552+
@Secured("USER")
553+
public void emptyPrefixRoleUser() {}
554+
}
555+
}
517556
}

0 commit comments

Comments
 (0)