Skip to content

Commit 0f4e1f2

Browse files
committed
Move FACTOR_X509 into PreAuthenticatedAuthenticationProvider
Issue spring-projectsgh-17933
1 parent e8accd0 commit 0f4e1f2

File tree

2 files changed

+22
-33
lines changed

2 files changed

+22
-33
lines changed

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

Lines changed: 3 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,15 @@
1717
package org.springframework.security.config.annotation.web.configurers;
1818

1919
import jakarta.servlet.http.HttpServletRequest;
20-
import org.jspecify.annotations.Nullable;
2120

2221
import org.springframework.context.ApplicationContext;
2322
import org.springframework.security.authentication.AuthenticationDetailsSource;
2423
import org.springframework.security.authentication.AuthenticationManager;
25-
import org.springframework.security.authentication.AuthenticationProvider;
2624
import org.springframework.security.config.Customizer;
2725
import org.springframework.security.config.annotation.web.HttpSecurityBuilder;
2826
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
2927
import org.springframework.security.core.Authentication;
30-
import org.springframework.security.core.AuthenticationException;
31-
import org.springframework.security.core.authority.SimpleGrantedAuthority;
28+
import org.springframework.security.core.authority.AuthorityUtils;
3229
import org.springframework.security.core.userdetails.AuthenticationUserDetailsService;
3330
import org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper;
3431
import org.springframework.security.core.userdetails.UserDetailsService;
@@ -182,7 +179,8 @@ public X509Configurer<H> subjectPrincipalRegex(String subjectPrincipalRegex) {
182179
public void init(H http) {
183180
PreAuthenticatedAuthenticationProvider authenticationProvider = new PreAuthenticatedAuthenticationProvider();
184181
authenticationProvider.setPreAuthenticatedUserDetailsService(getAuthenticationUserDetailsService(http));
185-
http.authenticationProvider(new AuthorityGrantingAuthenticationProvider(authenticationProvider))
182+
authenticationProvider.setGrantedAuthoritySupplier(() -> AuthorityUtils.createAuthorityList("FACTOR_X509"));
183+
http.authenticationProvider(authenticationProvider)
186184
.setSharedObject(AuthenticationEntryPoint.class, new Http403ForbiddenEntryPoint());
187185
ExceptionHandlingConfigurer<H> exceptions = http.getConfigurer(ExceptionHandlingConfigurer.class);
188186
if (exceptions != null) {
@@ -234,31 +232,4 @@ private <C> C getSharedOrBean(H http, Class<C> type) {
234232
return context.getBeanProvider(type).getIfUnique();
235233
}
236234

237-
private static final class AuthorityGrantingAuthenticationProvider implements AuthenticationProvider {
238-
239-
private final AuthenticationProvider delegate;
240-
241-
private AuthorityGrantingAuthenticationProvider(AuthenticationProvider delegate) {
242-
this.delegate = delegate;
243-
}
244-
245-
@Override
246-
public @Nullable Authentication authenticate(Authentication authentication) throws AuthenticationException {
247-
Authentication result = this.delegate.authenticate(authentication);
248-
if (result == null) {
249-
return result;
250-
}
251-
return result
252-
.toBuilder()
253-
.authorities((a) -> a.add(new SimpleGrantedAuthority("FACTOR_X509")))
254-
.build();
255-
}
256-
257-
@Override
258-
public boolean supports(Class<?> authentication) {
259-
return true;
260-
}
261-
262-
}
263-
264235
}

web/src/main/java/org/springframework/security/web/authentication/preauth/PreAuthenticatedAuthenticationProvider.java

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

1717
package org.springframework.security.web.authentication.preauth;
1818

19+
import java.util.Collection;
20+
import java.util.LinkedHashSet;
21+
import java.util.List;
22+
import java.util.function.Supplier;
23+
1924
import org.apache.commons.logging.Log;
2025
import org.apache.commons.logging.LogFactory;
2126
import org.jspecify.annotations.Nullable;
@@ -28,6 +33,7 @@
2833
import org.springframework.security.authentication.BadCredentialsException;
2934
import org.springframework.security.core.Authentication;
3035
import org.springframework.security.core.AuthenticationException;
36+
import org.springframework.security.core.GrantedAuthority;
3137
import org.springframework.security.core.userdetails.AuthenticationUserDetailsService;
3238
import org.springframework.security.core.userdetails.UserDetails;
3339
import org.springframework.security.core.userdetails.UserDetailsChecker;
@@ -57,6 +63,8 @@ public class PreAuthenticatedAuthenticationProvider implements AuthenticationPro
5763

5864
private UserDetailsChecker userDetailsChecker = new AccountStatusUserDetailsChecker();
5965

66+
private Supplier<Collection<GrantedAuthority>> grantedAuthoritySupplier = List::of;
67+
6068
private boolean throwExceptionWhenTokenRejected;
6169

6270
private int order = -1; // default: same as non-ordered
@@ -98,8 +106,10 @@ public void afterPropertiesSet() {
98106
UserDetails userDetails = this.preAuthenticatedUserDetailsService
99107
.loadUserDetails((PreAuthenticatedAuthenticationToken) authentication);
100108
this.userDetailsChecker.check(userDetails);
109+
Collection<GrantedAuthority> authorities = new LinkedHashSet<>(userDetails.getAuthorities());
110+
authorities.addAll(this.grantedAuthoritySupplier.get());
101111
PreAuthenticatedAuthenticationToken result = new PreAuthenticatedAuthenticationToken(userDetails,
102-
authentication.getCredentials(), userDetails.getAuthorities());
112+
authentication.getCredentials(), authorities);
103113
result.setDetails(authentication.getDetails());
104114
return result;
105115
}
@@ -142,6 +152,14 @@ public void setUserDetailsChecker(UserDetailsChecker userDetailsChecker) {
142152
this.userDetailsChecker = userDetailsChecker;
143153
}
144154

155+
/**
156+
* Sets authorities that this provider should grant once authentication completes
157+
* @param grantedAuthoritySupplier the supplier that grants authorities
158+
*/
159+
public void setGrantedAuthoritySupplier(Supplier<Collection<GrantedAuthority>> grantedAuthoritySupplier) {
160+
this.grantedAuthoritySupplier = grantedAuthoritySupplier;
161+
}
162+
145163
@Override
146164
public int getOrder() {
147165
return this.order;

0 commit comments

Comments
 (0)