Skip to content

Commit 783182d

Browse files
committed
Use AuthorizationManagerFactory for Secured annotations
Signed-off-by: Steve Riesenberg <[email protected]>
1 parent df4da33 commit 783182d

File tree

1 file changed

+41
-1
lines changed

1 file changed

+41
-1
lines changed

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

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,14 @@
1616

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

19+
import java.util.Collection;
20+
import java.util.Map;
21+
import java.util.concurrent.ConcurrentHashMap;
1922
import java.util.function.Supplier;
2023

2124
import org.aopalliance.intercept.MethodInterceptor;
2225
import org.aopalliance.intercept.MethodInvocation;
23-
26+
import org.jspecify.annotations.Nullable;
2427
import org.springframework.aop.Pointcut;
2528
import org.springframework.aop.framework.AopInfrastructureBean;
2629
import org.springframework.beans.factory.ObjectProvider;
@@ -36,9 +39,12 @@
3639
import org.springframework.security.authorization.AuthoritiesAuthorizationManager;
3740
import org.springframework.security.authorization.AuthorizationEventPublisher;
3841
import org.springframework.security.authorization.AuthorizationManager;
42+
import org.springframework.security.authorization.AuthorizationManagerFactory;
43+
import org.springframework.security.authorization.AuthorizationResult;
3944
import org.springframework.security.authorization.method.AuthorizationManagerBeforeMethodInterceptor;
4045
import org.springframework.security.authorization.method.SecuredAuthorizationManager;
4146
import org.springframework.security.config.ObjectPostProcessor;
47+
import org.springframework.security.core.Authentication;
4248
import org.springframework.security.core.context.SecurityContextHolderStrategy;
4349

4450
/**
@@ -101,4 +107,38 @@ void setEventPublisher(AuthorizationEventPublisher eventPublisher) {
101107
this.methodInterceptor.setAuthorizationEventPublisher(eventPublisher);
102108
}
103109

110+
@Autowired(required = false)
111+
void setAuthorizationManagerFactory(AuthorizationManagerFactory<Collection<String>> authorizationManagerFactory) {
112+
this.authorizationManager.setAuthoritiesAuthorizationManager(
113+
new DelegatingAuthoritiesAuthorizationManager(authorizationManagerFactory));
114+
}
115+
116+
private static final class DelegatingAuthoritiesAuthorizationManager
117+
implements AuthorizationManager<Collection<String>> {
118+
119+
private static final String[] STRING_ARRAY = new String[0];
120+
121+
private final AuthorizationManagerFactory<Collection<String>> authorizationManagerFactory;
122+
123+
private final Map<Collection<String>, AuthorizationManager<Collection<String>>> cachedAuthorizationManagers = new ConcurrentHashMap<>();
124+
125+
private DelegatingAuthoritiesAuthorizationManager(
126+
AuthorizationManagerFactory<Collection<String>> authorizationManagerFactory) {
127+
this.authorizationManagerFactory = authorizationManagerFactory;
128+
}
129+
130+
@Override
131+
public @Nullable AuthorizationResult authorize(Supplier<Authentication> authentication,
132+
Collection<String> authorities) {
133+
AuthorizationManager<Collection<String>> delegate = getAuthorizationManager(authorities);
134+
return delegate.authorize(authentication, authorities);
135+
}
136+
137+
private AuthorizationManager<Collection<String>> getAuthorizationManager(Collection<String> authorities) {
138+
return this.cachedAuthorizationManagers.computeIfAbsent(authorities,
139+
(k) -> this.authorizationManagerFactory.hasAnyAuthority(authorities.toArray(STRING_ARRAY)));
140+
}
141+
142+
}
143+
104144
}

0 commit comments

Comments
 (0)