Skip to content

Commit 8efdc5c

Browse files
Polish Contribution
Issue gh-13215
1 parent 401058d commit 8efdc5c

File tree

2 files changed

+54
-15
lines changed

2 files changed

+54
-15
lines changed

config/src/main/java/org/springframework/security/config/annotation/web/configurers/AuthorizeHttpRequestsConfigurer.java

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -63,22 +63,13 @@ public final class AuthorizeHttpRequestsConfigurer<H extends HttpSecurityBuilder
6363

6464
private final Supplier<RoleHierarchy> roleHierarchy;
6565

66-
private final String rolePrefix;
66+
private String rolePrefix = "ROLE_";
6767

6868
/**
6969
* Creates an instance.
7070
* @param context the {@link ApplicationContext} to use
7171
*/
7272
public AuthorizeHttpRequestsConfigurer(ApplicationContext context) {
73-
String[] grantedAuthorityDefaultsBeanNames = context.getBeanNamesForType(GrantedAuthorityDefaults.class);
74-
if (grantedAuthorityDefaultsBeanNames.length == 1) {
75-
GrantedAuthorityDefaults grantedAuthorityDefaults = context.getBean(grantedAuthorityDefaultsBeanNames[0],
76-
GrantedAuthorityDefaults.class);
77-
this.rolePrefix = grantedAuthorityDefaults.getRolePrefix();
78-
}
79-
else {
80-
this.rolePrefix = "ROLE_";
81-
}
8273
this.registry = new AuthorizationManagerRequestMatcherRegistry(context);
8374
if (context.getBeanNamesForType(AuthorizationEventPublisher.class).length > 0) {
8475
this.publisher = context.getBean(AuthorizationEventPublisher.class);
@@ -88,6 +79,11 @@ public AuthorizeHttpRequestsConfigurer(ApplicationContext context) {
8879
}
8980
this.roleHierarchy = SingletonSupplier.of(() -> (context.getBeanNamesForType(RoleHierarchy.class).length > 0)
9081
? context.getBean(RoleHierarchy.class) : new NullRoleHierarchy());
82+
String[] grantedAuthorityDefaultsBeanNames = context.getBeanNamesForType(GrantedAuthorityDefaults.class);
83+
if (grantedAuthorityDefaultsBeanNames.length > 0) {
84+
GrantedAuthorityDefaults grantedAuthorityDefaults = context.getBean(GrantedAuthorityDefaults.class);
85+
this.rolePrefix = grantedAuthorityDefaults.getRolePrefix();
86+
}
9187
}
9288

9389
/**
@@ -292,7 +288,7 @@ public AuthorizationManagerRequestMatcherRegistry denyAll() {
292288
*/
293289
public AuthorizationManagerRequestMatcherRegistry hasRole(String role) {
294290
return access(withRoleHierarchy(AuthorityAuthorizationManager
295-
.hasAuthority(AuthorizeHttpRequestsConfigurer.this.rolePrefix + role)));
291+
.hasAnyRole(AuthorizeHttpRequestsConfigurer.this.rolePrefix, new String[] { role })));
296292
}
297293

298294
/**
@@ -304,7 +300,8 @@ public AuthorizationManagerRequestMatcherRegistry hasRole(String role) {
304300
* customizations
305301
*/
306302
public AuthorizationManagerRequestMatcherRegistry hasAnyRole(String... roles) {
307-
return access(withRoleHierarchy(AuthorityAuthorizationManager.hasAnyRole(roles)));
303+
return access(withRoleHierarchy(
304+
AuthorityAuthorizationManager.hasAnyRole(AuthorizeHttpRequestsConfigurer.this.rolePrefix, roles)));
308305
}
309306

310307
/**

config/src/test/java/org/springframework/security/config/annotation/web/configurers/AuthorizeHttpRequestsConfigurerTests.java

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -477,14 +477,40 @@ public void getWhenExpressionRoleUserOrAdminConfiguredAndRoleIsOtherThenResponds
477477
}
478478

479479
@Test
480-
public void getWhenRoleUserConfiguredAsGrantedAuthorityDefaultThenRespondsWithOk() throws Exception {
481-
this.spring.register(GrantedAuthorityDefaultConfig.class, BasicController.class).autowire();
480+
public void getWhenCustomRolePrefixAndRoleHasDifferentPrefixThenRespondsWithForbidden() throws Exception {
481+
this.spring.register(GrantedAuthorityDefaultHasRoleConfig.class, BasicController.class).autowire();
482+
// @formatter:off
483+
MockHttpServletRequestBuilder requestWithUser = get("/")
484+
.with(user("user")
485+
.authorities(new SimpleGrantedAuthority("ROLE_USER")));
486+
// @formatter:on
487+
this.mvc.perform(requestWithUser).andExpect(status().isForbidden());
488+
}
489+
490+
@Test
491+
public void getWhenCustomRolePrefixAndHasRoleThenRespondsWithOk() throws Exception {
492+
this.spring.register(GrantedAuthorityDefaultHasRoleConfig.class, BasicController.class).autowire();
493+
// @formatter:off
494+
MockHttpServletRequestBuilder requestWithUser = get("/")
495+
.with(user("user")
496+
.authorities(new SimpleGrantedAuthority("CUSTOM_PREFIX_USER")));
497+
// @formatter:on
498+
this.mvc.perform(requestWithUser).andExpect(status().isOk());
499+
}
500+
501+
@Test
502+
public void getWhenCustomRolePrefixAndHasAnyRoleThenRespondsWithOk() throws Exception {
503+
this.spring.register(GrantedAuthorityDefaultHasAnyRoleConfig.class, BasicController.class).autowire();
482504
// @formatter:off
483505
MockHttpServletRequestBuilder requestWithUser = get("/")
484506
.with(user("user")
485507
.authorities(new SimpleGrantedAuthority("CUSTOM_PREFIX_USER")));
508+
MockHttpServletRequestBuilder requestWithAdmin = get("/")
509+
.with(user("user")
510+
.authorities(new SimpleGrantedAuthority("CUSTOM_PREFIX_ADMIN")));
486511
// @formatter:on
487512
this.mvc.perform(requestWithUser).andExpect(status().isOk());
513+
this.mvc.perform(requestWithAdmin).andExpect(status().isOk());
488514
}
489515

490516
@Test
@@ -571,7 +597,7 @@ public void getWhenAnonymousConfiguredAndLoggedInUserThenRespondsWithForbidden()
571597

572598
@Configuration
573599
@EnableWebSecurity
574-
static class GrantedAuthorityDefaultConfig {
600+
static class GrantedAuthorityDefaultHasRoleConfig {
575601

576602
@Bean
577603
GrantedAuthorityDefaults grantedAuthorityDefaults() {
@@ -585,6 +611,22 @@ SecurityFilterChain myFilterChain(HttpSecurity http) throws Exception {
585611

586612
}
587613

614+
@Configuration
615+
@EnableWebSecurity
616+
static class GrantedAuthorityDefaultHasAnyRoleConfig {
617+
618+
@Bean
619+
GrantedAuthorityDefaults grantedAuthorityDefaults() {
620+
return new GrantedAuthorityDefaults("CUSTOM_PREFIX_");
621+
}
622+
623+
@Bean
624+
SecurityFilterChain myFilterChain(HttpSecurity http) throws Exception {
625+
return http.authorizeHttpRequests((c) -> c.anyRequest().hasAnyRole("USER", "ADMIN")).build();
626+
}
627+
628+
}
629+
588630
@Configuration
589631
@EnableWebSecurity
590632
static class NoRequestsConfig {

0 commit comments

Comments
 (0)