1616
1717package org .springframework .security .config .annotation .web .configurers ;
1818
19+ import java .util .ArrayList ;
20+ import java .util .Collection ;
1921import java .util .List ;
2022import java .util .function .Function ;
2123import java .util .function .Supplier ;
2830import org .springframework .security .access .hierarchicalroles .NullRoleHierarchy ;
2931import org .springframework .security .access .hierarchicalroles .RoleHierarchy ;
3032import org .springframework .security .authorization .AuthenticatedAuthorizationManager ;
33+ import org .springframework .security .authorization .AuthoritiesAuthorizationManager ;
3134import org .springframework .security .authorization .AuthorityAuthorizationManager ;
3235import org .springframework .security .authorization .AuthorizationDecision ;
3336import org .springframework .security .authorization .AuthorizationEventPublisher ;
3437import org .springframework .security .authorization .AuthorizationManager ;
3538import org .springframework .security .authorization .AuthorizationManagers ;
39+ import org .springframework .security .authorization .AuthorizationResult ;
3640import org .springframework .security .authorization .SingleResultAuthorizationManager ;
3741import org .springframework .security .authorization .SpringAuthorizationEventPublisher ;
3842import org .springframework .security .config .ObjectPostProcessor ;
@@ -139,6 +143,8 @@ public final class AuthorizationManagerRequestMatcherRegistry
139143 private final RequestMatcherDelegatingAuthorizationManager .Builder managerBuilder = RequestMatcherDelegatingAuthorizationManager
140144 .builder ();
141145
146+ private final HasAllAuthoritiesAuthorizationManager <RequestAuthorizationContext > hasAuthority = new HasAllAuthoritiesAuthorizationManager <>();
147+
142148 private List <RequestMatcher > unmappedMatchers ;
143149
144150 private int mappingCount ;
@@ -165,6 +171,7 @@ private AuthorizationManager<HttpServletRequest> createAuthorizationManager() {
165171 + ". Try completing it with something like requestUrls().<something>.hasRole('USER')" );
166172 Assert .state (this .mappingCount > 0 ,
167173 "At least one mapping is required (for example, authorizeHttpRequests().anyRequest().authenticated())" );
174+ this .hasAuthority .setRoleHierarchy (AuthorizeHttpRequestsConfigurer .this .roleHierarchy .get ());
168175 AuthorizationManager <HttpServletRequest > manager = postProcess (
169176 (AuthorizationManager <HttpServletRequest >) this .managerBuilder .build ());
170177 return AuthorizeHttpRequestsConfigurer .this .postProcessor .postProcess (manager );
@@ -173,7 +180,7 @@ private AuthorizationManager<HttpServletRequest> createAuthorizationManager() {
173180 @ Override
174181 protected AuthorizedUrl chainRequestMatchers (List <RequestMatcher > requestMatchers ) {
175182 this .unmappedMatchers = requestMatchers ;
176- return new AuthorizedUrl (requestMatchers );
183+ return new AuthorizedUrl (this , requestMatchers );
177184 }
178185
179186 /**
@@ -188,6 +195,10 @@ public AuthorizationManagerRequestMatcherRegistry withObjectPostProcessor(
188195 return this ;
189196 }
190197
198+ void hasAuthority (String authority ) {
199+ this .hasAuthority .add (authority );
200+ }
201+
191202 }
192203
193204 /**
@@ -199,6 +210,8 @@ public AuthorizationManagerRequestMatcherRegistry withObjectPostProcessor(
199210 */
200211 public class AuthorizedUrl {
201212
213+ private final AuthorizationManagerRequestMatcherRegistry registry ;
214+
202215 private final List <? extends RequestMatcher > matchers ;
203216
204217 private boolean not ;
@@ -207,7 +220,8 @@ public class AuthorizedUrl {
207220 * Creates an instance.
208221 * @param matchers the {@link RequestMatcher} instances to map
209222 */
210- AuthorizedUrl (List <? extends RequestMatcher > matchers ) {
223+ AuthorizedUrl (AuthorizationManagerRequestMatcherRegistry registry , List <? extends RequestMatcher > matchers ) {
224+ this .registry = registry ;
211225 this .matchers = matchers ;
212226 }
213227
@@ -289,10 +303,10 @@ public AuthorizationManagerRequestMatcherRegistry hasAnyAuthority(String... auth
289303 return access (withRoleHierarchy (AuthorityAuthorizationManager .hasAnyAuthority (authorities )));
290304 }
291305
292- private AuthorityAuthorizationManager <RequestAuthorizationContext > withRoleHierarchy (
306+ private AuthorizationManager <RequestAuthorizationContext > withRoleHierarchy (
293307 AuthorityAuthorizationManager <RequestAuthorizationContext > manager ) {
294308 manager .setRoleHierarchy (AuthorizeHttpRequestsConfigurer .this .roleHierarchy .get ());
295- return manager ;
309+ return withAuthentication ( manager ) ;
296310 }
297311
298312 /**
@@ -301,7 +315,7 @@ private AuthorityAuthorizationManager<RequestAuthorizationContext> withRoleHiera
301315 * customizations
302316 */
303317 public AuthorizationManagerRequestMatcherRegistry authenticated () {
304- return access (AuthenticatedAuthorizationManager .authenticated ());
318+ return access (withAuthentication ( AuthenticatedAuthorizationManager .authenticated () ));
305319 }
306320
307321 /**
@@ -313,7 +327,7 @@ public AuthorizationManagerRequestMatcherRegistry authenticated() {
313327 * @see RememberMeConfigurer
314328 */
315329 public AuthorizationManagerRequestMatcherRegistry fullyAuthenticated () {
316- return access (AuthenticatedAuthorizationManager .fullyAuthenticated ());
330+ return access (withAuthentication ( AuthenticatedAuthorizationManager .fullyAuthenticated () ));
317331 }
318332
319333 /**
@@ -324,7 +338,7 @@ public AuthorizationManagerRequestMatcherRegistry fullyAuthenticated() {
324338 * @see RememberMeConfigurer
325339 */
326340 public AuthorizationManagerRequestMatcherRegistry rememberMe () {
327- return access (AuthenticatedAuthorizationManager .rememberMe ());
341+ return access (withAuthentication ( AuthenticatedAuthorizationManager .rememberMe () ));
328342 }
329343
330344 /**
@@ -366,6 +380,11 @@ public AuthorizationManagerRequestMatcherRegistry access(
366380 : AuthorizeHttpRequestsConfigurer .this .addMapping (this .matchers , manager );
367381 }
368382
383+ private AuthorizationManager <RequestAuthorizationContext > withAuthentication (
384+ AuthorizationManager <RequestAuthorizationContext > manager ) {
385+ return AuthorizationManagers .allOf (this .registry .hasAuthority , manager );
386+ }
387+
369388 /**
370389 * An object that allows configuring {@link RequestMatcher}s with URI path
371390 * variables
@@ -403,4 +422,25 @@ public AuthorizationManagerRequestMatcherRegistry equalTo(Function<Authenticatio
403422
404423 }
405424
425+ private static final class HasAllAuthoritiesAuthorizationManager <T > implements AuthorizationManager <T > {
426+
427+ private final AuthoritiesAuthorizationManager delegate = AuthoritiesAuthorizationManager .hasAllAuthorities ();
428+
429+ private final Collection <String > authorities = new ArrayList <>();
430+
431+ @ Override
432+ public AuthorizationResult authorize (Supplier <Authentication > authentication , T object ) {
433+ return this .delegate .authorize (authentication , this .authorities );
434+ }
435+
436+ private void setRoleHierarchy (RoleHierarchy hierarchy ) {
437+ this .delegate .setRoleHierarchy (hierarchy );
438+ }
439+
440+ private void add (String authority ) {
441+ this .authorities .add (authority );
442+ }
443+
444+ }
445+
406446}
0 commit comments