parent
5237c6e01b
commit
9fbea5a11e
|
@ -20,10 +20,10 @@ import org.springframework.core.ResolvableType;
|
||||||
import org.springframework.security.config.annotation.web.HttpSecurityBuilder;
|
import org.springframework.security.config.annotation.web.HttpSecurityBuilder;
|
||||||
import org.springframework.security.config.annotation.web.configurers.AbstractAuthenticationFilterConfigurer;
|
import org.springframework.security.config.annotation.web.configurers.AbstractAuthenticationFilterConfigurer;
|
||||||
import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper;
|
import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper;
|
||||||
import org.springframework.security.oauth2.client.authentication.OAuth2LoginAuthenticationProvider;
|
|
||||||
import org.springframework.security.oauth2.client.authentication.AuthorizationCodeAuthenticationToken;
|
import org.springframework.security.oauth2.client.authentication.AuthorizationCodeAuthenticationToken;
|
||||||
import org.springframework.security.oauth2.client.authentication.AuthorizationGrantTokenExchanger;
|
import org.springframework.security.oauth2.client.authentication.AuthorizationGrantTokenExchanger;
|
||||||
import org.springframework.security.oauth2.client.authentication.NimbusAuthorizationCodeTokenExchanger;
|
import org.springframework.security.oauth2.client.authentication.NimbusAuthorizationCodeTokenExchanger;
|
||||||
|
import org.springframework.security.oauth2.client.authentication.OAuth2LoginAuthenticationProvider;
|
||||||
import org.springframework.security.oauth2.client.authentication.jwt.JwtDecoderRegistry;
|
import org.springframework.security.oauth2.client.authentication.jwt.JwtDecoderRegistry;
|
||||||
import org.springframework.security.oauth2.client.authentication.jwt.NimbusJwtDecoderRegistry;
|
import org.springframework.security.oauth2.client.authentication.jwt.NimbusJwtDecoderRegistry;
|
||||||
import org.springframework.security.oauth2.client.authentication.userinfo.CustomUserTypesOAuth2UserService;
|
import org.springframework.security.oauth2.client.authentication.userinfo.CustomUserTypesOAuth2UserService;
|
||||||
|
@ -33,7 +33,7 @@ import org.springframework.security.oauth2.client.authentication.userinfo.OAuth2
|
||||||
import org.springframework.security.oauth2.client.registration.ClientRegistration;
|
import org.springframework.security.oauth2.client.registration.ClientRegistration;
|
||||||
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
|
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
|
||||||
import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository;
|
import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository;
|
||||||
import org.springframework.security.oauth2.client.token.SecurityTokenRepository;
|
import org.springframework.security.oauth2.client.token.OAuth2TokenRepository;
|
||||||
import org.springframework.security.oauth2.client.web.AuthorizationRequestRedirectFilter;
|
import org.springframework.security.oauth2.client.web.AuthorizationRequestRedirectFilter;
|
||||||
import org.springframework.security.oauth2.client.web.AuthorizationRequestRepository;
|
import org.springframework.security.oauth2.client.web.AuthorizationRequestRepository;
|
||||||
import org.springframework.security.oauth2.client.web.OAuth2LoginAuthenticationFilter;
|
import org.springframework.security.oauth2.client.web.OAuth2LoginAuthenticationFilter;
|
||||||
|
@ -132,7 +132,7 @@ public final class OAuth2LoginConfigurer<B extends HttpSecurityBuilder<B>> exten
|
||||||
|
|
||||||
public class TokenEndpointConfig {
|
public class TokenEndpointConfig {
|
||||||
private AuthorizationGrantTokenExchanger<AuthorizationCodeAuthenticationToken> authorizationCodeTokenExchanger;
|
private AuthorizationGrantTokenExchanger<AuthorizationCodeAuthenticationToken> authorizationCodeTokenExchanger;
|
||||||
private SecurityTokenRepository<AccessToken> accessTokenRepository;
|
private OAuth2TokenRepository<AccessToken> accessTokenRepository;
|
||||||
private JwtDecoderRegistry jwtDecoderRegistry;
|
private JwtDecoderRegistry jwtDecoderRegistry;
|
||||||
|
|
||||||
private TokenEndpointConfig() {
|
private TokenEndpointConfig() {
|
||||||
|
@ -146,7 +146,7 @@ public final class OAuth2LoginConfigurer<B extends HttpSecurityBuilder<B>> exten
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TokenEndpointConfig accessTokenRepository(SecurityTokenRepository<AccessToken> accessTokenRepository) {
|
public TokenEndpointConfig accessTokenRepository(OAuth2TokenRepository<AccessToken> accessTokenRepository) {
|
||||||
Assert.notNull(accessTokenRepository, "accessTokenRepository cannot be null");
|
Assert.notNull(accessTokenRepository, "accessTokenRepository cannot be null");
|
||||||
this.accessTokenRepository = accessTokenRepository;
|
this.accessTokenRepository = accessTokenRepository;
|
||||||
return this;
|
return this;
|
||||||
|
@ -249,10 +249,6 @@ public final class OAuth2LoginConfigurer<B extends HttpSecurityBuilder<B>> exten
|
||||||
|
|
||||||
OAuth2LoginAuthenticationProvider oauth2LoginAuthenticationProvider =
|
OAuth2LoginAuthenticationProvider oauth2LoginAuthenticationProvider =
|
||||||
new OAuth2LoginAuthenticationProvider(authorizationCodeTokenExchanger, oauth2UserService);
|
new OAuth2LoginAuthenticationProvider(authorizationCodeTokenExchanger, oauth2UserService);
|
||||||
if (this.tokenEndpointConfig.accessTokenRepository != null) {
|
|
||||||
oauth2LoginAuthenticationProvider.setAccessTokenRepository(
|
|
||||||
this.tokenEndpointConfig.accessTokenRepository);
|
|
||||||
}
|
|
||||||
if (this.userInfoEndpointConfig.userAuthoritiesMapper != null) {
|
if (this.userInfoEndpointConfig.userAuthoritiesMapper != null) {
|
||||||
oauth2LoginAuthenticationProvider.setAuthoritiesMapper(
|
oauth2LoginAuthenticationProvider.setAuthoritiesMapper(
|
||||||
this.userInfoEndpointConfig.userAuthoritiesMapper);
|
this.userInfoEndpointConfig.userAuthoritiesMapper);
|
||||||
|
@ -267,10 +263,6 @@ public final class OAuth2LoginConfigurer<B extends HttpSecurityBuilder<B>> exten
|
||||||
OidcAuthorizationCodeAuthenticationProvider oidcAuthorizationCodeAuthenticationProvider =
|
OidcAuthorizationCodeAuthenticationProvider oidcAuthorizationCodeAuthenticationProvider =
|
||||||
new OidcAuthorizationCodeAuthenticationProvider(
|
new OidcAuthorizationCodeAuthenticationProvider(
|
||||||
authorizationCodeTokenExchanger, oidcUserService, jwtDecoderRegistry);
|
authorizationCodeTokenExchanger, oidcUserService, jwtDecoderRegistry);
|
||||||
if (this.tokenEndpointConfig.accessTokenRepository != null) {
|
|
||||||
oidcAuthorizationCodeAuthenticationProvider.setAccessTokenRepository(
|
|
||||||
this.tokenEndpointConfig.accessTokenRepository);
|
|
||||||
}
|
|
||||||
if (this.userInfoEndpointConfig.userAuthoritiesMapper != null) {
|
if (this.userInfoEndpointConfig.userAuthoritiesMapper != null) {
|
||||||
oidcAuthorizationCodeAuthenticationProvider.setAuthoritiesMapper(
|
oidcAuthorizationCodeAuthenticationProvider.setAuthoritiesMapper(
|
||||||
this.userInfoEndpointConfig.userAuthoritiesMapper);
|
this.userInfoEndpointConfig.userAuthoritiesMapper);
|
||||||
|
@ -308,6 +300,10 @@ public final class OAuth2LoginConfigurer<B extends HttpSecurityBuilder<B>> exten
|
||||||
authorizationResponseFilter.setAuthorizationRequestRepository(
|
authorizationResponseFilter.setAuthorizationRequestRepository(
|
||||||
this.authorizationEndpointConfig.authorizationRequestRepository);
|
this.authorizationEndpointConfig.authorizationRequestRepository);
|
||||||
}
|
}
|
||||||
|
if (this.tokenEndpointConfig.accessTokenRepository != null) {
|
||||||
|
authorizationResponseFilter.setAccessTokenRepository(
|
||||||
|
this.tokenEndpointConfig.accessTokenRepository);
|
||||||
|
}
|
||||||
super.configure(http);
|
super.configure(http);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,8 +22,6 @@ import org.springframework.security.core.GrantedAuthority;
|
||||||
import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper;
|
import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper;
|
||||||
import org.springframework.security.oauth2.client.authentication.userinfo.OAuth2AuthenticationToken;
|
import org.springframework.security.oauth2.client.authentication.userinfo.OAuth2AuthenticationToken;
|
||||||
import org.springframework.security.oauth2.client.authentication.userinfo.OAuth2UserService;
|
import org.springframework.security.oauth2.client.authentication.userinfo.OAuth2UserService;
|
||||||
import org.springframework.security.oauth2.client.token.InMemoryAccessTokenRepository;
|
|
||||||
import org.springframework.security.oauth2.client.token.SecurityTokenRepository;
|
|
||||||
import org.springframework.security.oauth2.core.AccessToken;
|
import org.springframework.security.oauth2.core.AccessToken;
|
||||||
import org.springframework.security.oauth2.core.OAuth2Error;
|
import org.springframework.security.oauth2.core.OAuth2Error;
|
||||||
import org.springframework.security.oauth2.core.endpoint.AuthorizationRequest;
|
import org.springframework.security.oauth2.core.endpoint.AuthorizationRequest;
|
||||||
|
@ -49,7 +47,6 @@ import java.util.Collection;
|
||||||
* @author Joe Grandja
|
* @author Joe Grandja
|
||||||
* @since 5.0
|
* @since 5.0
|
||||||
* @see AuthorizationCodeAuthenticationToken
|
* @see AuthorizationCodeAuthenticationToken
|
||||||
* @see SecurityTokenRepository
|
|
||||||
* @see OAuth2AuthenticationToken
|
* @see OAuth2AuthenticationToken
|
||||||
* @see AuthorizedClient
|
* @see AuthorizedClient
|
||||||
* @see OAuth2UserService
|
* @see OAuth2UserService
|
||||||
|
@ -63,7 +60,6 @@ public class OAuth2LoginAuthenticationProvider implements AuthenticationProvider
|
||||||
private static final String INVALID_REDIRECT_URI_PARAMETER_ERROR_CODE = "invalid_redirect_uri_parameter";
|
private static final String INVALID_REDIRECT_URI_PARAMETER_ERROR_CODE = "invalid_redirect_uri_parameter";
|
||||||
private final AuthorizationGrantTokenExchanger<AuthorizationCodeAuthenticationToken> authorizationCodeTokenExchanger;
|
private final AuthorizationGrantTokenExchanger<AuthorizationCodeAuthenticationToken> authorizationCodeTokenExchanger;
|
||||||
private final OAuth2UserService userService;
|
private final OAuth2UserService userService;
|
||||||
private SecurityTokenRepository<AccessToken> accessTokenRepository = new InMemoryAccessTokenRepository();
|
|
||||||
private GrantedAuthoritiesMapper authoritiesMapper = (authorities -> authorities);
|
private GrantedAuthoritiesMapper authoritiesMapper = (authorities -> authorities);
|
||||||
|
|
||||||
public OAuth2LoginAuthenticationProvider(
|
public OAuth2LoginAuthenticationProvider(
|
||||||
|
@ -121,10 +117,6 @@ public class OAuth2LoginAuthenticationProvider implements AuthenticationProvider
|
||||||
AuthorizedClient authorizedClient = new AuthorizedClient(
|
AuthorizedClient authorizedClient = new AuthorizedClient(
|
||||||
authorizationCodeAuthentication.getClientRegistration(), "unknown", accessToken);
|
authorizationCodeAuthentication.getClientRegistration(), "unknown", accessToken);
|
||||||
|
|
||||||
this.accessTokenRepository.saveSecurityToken(
|
|
||||||
authorizedClient.getAccessToken(),
|
|
||||||
authorizedClient.getClientRegistration());
|
|
||||||
|
|
||||||
OAuth2User oauth2User = this.userService.loadUser(authorizedClient);
|
OAuth2User oauth2User = this.userService.loadUser(authorizedClient);
|
||||||
|
|
||||||
// Update AuthorizedClient now that we know the 'principalName'
|
// Update AuthorizedClient now that we know the 'principalName'
|
||||||
|
@ -141,11 +133,6 @@ public class OAuth2LoginAuthenticationProvider implements AuthenticationProvider
|
||||||
return authenticationResult;
|
return authenticationResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void setAccessTokenRepository(SecurityTokenRepository<AccessToken> accessTokenRepository) {
|
|
||||||
Assert.notNull(accessTokenRepository, "accessTokenRepository cannot be null");
|
|
||||||
this.accessTokenRepository = accessTokenRepository;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void setAuthoritiesMapper(GrantedAuthoritiesMapper authoritiesMapper) {
|
public final void setAuthoritiesMapper(GrantedAuthoritiesMapper authoritiesMapper) {
|
||||||
Assert.notNull(authoritiesMapper, "authoritiesMapper cannot be null");
|
Assert.notNull(authoritiesMapper, "authoritiesMapper cannot be null");
|
||||||
this.authoritiesMapper = authoritiesMapper;
|
this.authoritiesMapper = authoritiesMapper;
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
*/
|
*/
|
||||||
package org.springframework.security.oauth2.client.token;
|
package org.springframework.security.oauth2.client.token;
|
||||||
|
|
||||||
|
import org.springframework.security.core.Authentication;
|
||||||
import org.springframework.security.oauth2.client.registration.ClientRegistration;
|
import org.springframework.security.oauth2.client.registration.ClientRegistration;
|
||||||
import org.springframework.security.oauth2.core.AccessToken;
|
import org.springframework.security.oauth2.core.AccessToken;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
@ -24,55 +25,42 @@ import java.util.Map;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A {@link SecurityTokenRepository} that associates an {@link AccessToken}
|
* An <i>in-memory</i> {@link OAuth2TokenRepository} for {@link AccessToken}'s.
|
||||||
* to a {@link ClientRegistration Client} and stores it <i>in-memory</i>.
|
|
||||||
*
|
*
|
||||||
* @author Joe Grandja
|
* @author Joe Grandja
|
||||||
* @since 5.0
|
* @since 5.0
|
||||||
* @see SecurityTokenRepository
|
* @see OAuth2TokenRepository
|
||||||
* @see AccessToken
|
* @see AccessToken
|
||||||
* @see ClientRegistration
|
* @see ClientRegistration
|
||||||
|
* @see Authentication
|
||||||
*/
|
*/
|
||||||
public final class InMemoryAccessTokenRepository implements SecurityTokenRepository<AccessToken> {
|
public final class InMemoryAccessTokenRepository implements OAuth2TokenRepository<AccessToken> {
|
||||||
private final Map<String, AccessToken> accessTokens = new ConcurrentHashMap<>();
|
private final Map<String, AccessToken> accessTokens = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AccessToken loadSecurityToken(ClientRegistration registration) {
|
public AccessToken loadToken(ClientRegistration registration, Authentication principal) {
|
||||||
Assert.notNull(registration, "registration cannot be null");
|
Assert.notNull(registration, "registration cannot be null");
|
||||||
return this.accessTokens.get(this.getClientIdentifier(registration));
|
Assert.notNull(principal, "principal cannot be null");
|
||||||
|
return this.accessTokens.get(this.getIdentifier(registration, principal));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void saveSecurityToken(AccessToken accessToken, ClientRegistration registration) {
|
public void saveToken(AccessToken accessToken, ClientRegistration registration, Authentication principal) {
|
||||||
Assert.notNull(accessToken, "accessToken cannot be null");
|
Assert.notNull(accessToken, "accessToken cannot be null");
|
||||||
Assert.notNull(registration, "registration cannot be null");
|
Assert.notNull(registration, "registration cannot be null");
|
||||||
this.accessTokens.put(this.getClientIdentifier(registration), accessToken);
|
Assert.notNull(principal, "principal cannot be null");
|
||||||
|
this.accessTokens.put(this.getIdentifier(registration, principal), accessToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void removeSecurityToken(ClientRegistration registration) {
|
public AccessToken removeToken(ClientRegistration registration, Authentication principal) {
|
||||||
Assert.notNull(registration, "registration cannot be null");
|
Assert.notNull(registration, "registration cannot be null");
|
||||||
this.accessTokens.remove(this.getClientIdentifier(registration));
|
Assert.notNull(principal, "principal cannot be null");
|
||||||
|
return this.accessTokens.remove(this.getIdentifier(registration, principal));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
private String getIdentifier(ClientRegistration registration, Authentication principal) {
|
||||||
* A client is considered <i>"authorized"</i>, if it receives a successful response from the <i>Token Endpoint</i>.
|
String identifier = "[" + registration.getRegistrationId() + "][" + principal.getName() + "]";
|
||||||
*
|
return Base64.getEncoder().encodeToString(identifier.getBytes());
|
||||||
* @see <a target="_blank" href="https://tools.ietf.org/html/rfc6749#section-4.1.3">Section 4.1.3 Access Token Request</a>
|
|
||||||
* @see <a target="_blank" href="https://tools.ietf.org/html/rfc6749#section-5.1">Section 5.1 Access Token Response</a>
|
|
||||||
*/
|
|
||||||
private String getClientIdentifier(ClientRegistration clientRegistration) {
|
|
||||||
StringBuilder builder = new StringBuilder();
|
|
||||||
|
|
||||||
// Access Token Request attributes
|
|
||||||
builder.append("[").append(clientRegistration.getAuthorizationGrantType().getValue()).append("]");
|
|
||||||
builder.append("[").append(clientRegistration.getRedirectUri()).append("]");
|
|
||||||
builder.append("[").append(clientRegistration.getClientId()).append("]");
|
|
||||||
|
|
||||||
// Access Token Response attributes
|
|
||||||
builder.append("[").append(clientRegistration.getScopes().toString()).append("]");
|
|
||||||
|
|
||||||
return Base64.getEncoder().encodeToString(builder.toString().getBytes());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,24 +15,28 @@
|
||||||
*/
|
*/
|
||||||
package org.springframework.security.oauth2.client.token;
|
package org.springframework.security.oauth2.client.token;
|
||||||
|
|
||||||
|
import org.springframework.security.core.Authentication;
|
||||||
import org.springframework.security.oauth2.client.registration.ClientRegistration;
|
import org.springframework.security.oauth2.client.registration.ClientRegistration;
|
||||||
import org.springframework.security.oauth2.core.AbstractOAuth2Token;
|
import org.springframework.security.oauth2.core.AbstractOAuth2Token;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementations of this interface are responsible for the persistence
|
* Implementations of this interface are responsible for the persistence
|
||||||
* and association of an {@link AbstractOAuth2Token} to a {@link ClientRegistration Client}.
|
* and association of an {@link AbstractOAuth2Token OAuth 2.0 Token}
|
||||||
|
* to a {@link ClientRegistration Client} and <i>Resource Owner</i>,
|
||||||
|
* which is the {@link Authentication Principal} who originally granted the authorization.
|
||||||
*
|
*
|
||||||
* @author Joe Grandja
|
* @author Joe Grandja
|
||||||
* @since 5.0
|
* @since 5.0
|
||||||
* @see AbstractOAuth2Token
|
* @see AbstractOAuth2Token
|
||||||
* @see ClientRegistration
|
* @see ClientRegistration
|
||||||
|
* @see Authentication
|
||||||
*/
|
*/
|
||||||
public interface SecurityTokenRepository<T extends AbstractOAuth2Token> {
|
public interface OAuth2TokenRepository<T extends AbstractOAuth2Token> {
|
||||||
|
|
||||||
T loadSecurityToken(ClientRegistration registration);
|
T loadToken(ClientRegistration registration, Authentication principal);
|
||||||
|
|
||||||
void saveSecurityToken(T securityToken, ClientRegistration registration);
|
void saveToken(T token, ClientRegistration registration, Authentication principal);
|
||||||
|
|
||||||
void removeSecurityToken(ClientRegistration registration);
|
T removeToken(ClientRegistration registration, Authentication principal);
|
||||||
|
|
||||||
}
|
}
|
|
@ -18,11 +18,15 @@ package org.springframework.security.oauth2.client.web;
|
||||||
import org.springframework.security.authentication.AuthenticationManager;
|
import org.springframework.security.authentication.AuthenticationManager;
|
||||||
import org.springframework.security.core.Authentication;
|
import org.springframework.security.core.Authentication;
|
||||||
import org.springframework.security.core.AuthenticationException;
|
import org.springframework.security.core.AuthenticationException;
|
||||||
import org.springframework.security.oauth2.client.authentication.OAuth2LoginAuthenticationProvider;
|
|
||||||
import org.springframework.security.oauth2.client.authentication.AuthorizationCodeAuthenticationToken;
|
import org.springframework.security.oauth2.client.authentication.AuthorizationCodeAuthenticationToken;
|
||||||
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationException;
|
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationException;
|
||||||
|
import org.springframework.security.oauth2.client.authentication.OAuth2LoginAuthenticationProvider;
|
||||||
|
import org.springframework.security.oauth2.client.authentication.userinfo.OAuth2AuthenticationToken;
|
||||||
import org.springframework.security.oauth2.client.registration.ClientRegistration;
|
import org.springframework.security.oauth2.client.registration.ClientRegistration;
|
||||||
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
|
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
|
||||||
|
import org.springframework.security.oauth2.client.token.InMemoryAccessTokenRepository;
|
||||||
|
import org.springframework.security.oauth2.client.token.OAuth2TokenRepository;
|
||||||
|
import org.springframework.security.oauth2.core.AccessToken;
|
||||||
import org.springframework.security.oauth2.core.OAuth2Error;
|
import org.springframework.security.oauth2.core.OAuth2Error;
|
||||||
import org.springframework.security.oauth2.core.OAuth2ErrorCode;
|
import org.springframework.security.oauth2.core.OAuth2ErrorCode;
|
||||||
import org.springframework.security.oauth2.core.endpoint.AuthorizationExchange;
|
import org.springframework.security.oauth2.core.endpoint.AuthorizationExchange;
|
||||||
|
@ -63,12 +67,14 @@ import java.io.IOException;
|
||||||
* @since 5.0
|
* @since 5.0
|
||||||
* @see AbstractAuthenticationProcessingFilter
|
* @see AbstractAuthenticationProcessingFilter
|
||||||
* @see AuthorizationCodeAuthenticationToken
|
* @see AuthorizationCodeAuthenticationToken
|
||||||
|
* @see OAuth2AuthenticationToken
|
||||||
* @see OAuth2LoginAuthenticationProvider
|
* @see OAuth2LoginAuthenticationProvider
|
||||||
* @see AuthorizationResponse
|
|
||||||
* @see AuthorizationRequest
|
* @see AuthorizationRequest
|
||||||
|
* @see AuthorizationResponse
|
||||||
* @see AuthorizationRequestRepository
|
* @see AuthorizationRequestRepository
|
||||||
* @see AuthorizationRequestRedirectFilter
|
* @see AuthorizationRequestRedirectFilter
|
||||||
* @see ClientRegistrationRepository
|
* @see ClientRegistrationRepository
|
||||||
|
* @see OAuth2TokenRepository
|
||||||
* @see <a target="_blank" href="https://tools.ietf.org/html/rfc6749#section-4.1">Section 4.1 Authorization Code Grant</a>
|
* @see <a target="_blank" href="https://tools.ietf.org/html/rfc6749#section-4.1">Section 4.1 Authorization Code Grant</a>
|
||||||
* @see <a target="_blank" href="https://tools.ietf.org/html/rfc6749#section-4.1.2">Section 4.1.2 Authorization Response</a>
|
* @see <a target="_blank" href="https://tools.ietf.org/html/rfc6749#section-4.1.2">Section 4.1.2 Authorization Response</a>
|
||||||
*/
|
*/
|
||||||
|
@ -77,6 +83,7 @@ public class OAuth2LoginAuthenticationFilter extends AbstractAuthenticationProce
|
||||||
private static final String AUTHORIZATION_REQUEST_NOT_FOUND_ERROR_CODE = "authorization_request_not_found";
|
private static final String AUTHORIZATION_REQUEST_NOT_FOUND_ERROR_CODE = "authorization_request_not_found";
|
||||||
private ClientRegistrationRepository clientRegistrationRepository;
|
private ClientRegistrationRepository clientRegistrationRepository;
|
||||||
private AuthorizationRequestRepository authorizationRequestRepository = new HttpSessionAuthorizationRequestRepository();
|
private AuthorizationRequestRepository authorizationRequestRepository = new HttpSessionAuthorizationRequestRepository();
|
||||||
|
private OAuth2TokenRepository<AccessToken> accessTokenRepository = new InMemoryAccessTokenRepository();
|
||||||
|
|
||||||
public OAuth2LoginAuthenticationFilter() {
|
public OAuth2LoginAuthenticationFilter() {
|
||||||
this(DEFAULT_FILTER_PROCESSES_URI);
|
this(DEFAULT_FILTER_PROCESSES_URI);
|
||||||
|
@ -127,7 +134,15 @@ public class OAuth2LoginAuthenticationFilter extends AbstractAuthenticationProce
|
||||||
clientRegistration, new AuthorizationExchange(authorizationRequest, authorizationResponse));
|
clientRegistration, new AuthorizationExchange(authorizationRequest, authorizationResponse));
|
||||||
authorizationCodeAuthentication.setDetails(this.authenticationDetailsSource.buildDetails(request));
|
authorizationCodeAuthentication.setDetails(this.authenticationDetailsSource.buildDetails(request));
|
||||||
|
|
||||||
return this.getAuthenticationManager().authenticate(authorizationCodeAuthentication);
|
OAuth2AuthenticationToken oauth2Authentication =
|
||||||
|
(OAuth2AuthenticationToken) this.getAuthenticationManager().authenticate(authorizationCodeAuthentication);
|
||||||
|
|
||||||
|
this.accessTokenRepository.saveToken(
|
||||||
|
oauth2Authentication.getAuthorizedClient().getAccessToken(),
|
||||||
|
oauth2Authentication.getAuthorizedClient().getClientRegistration(),
|
||||||
|
oauth2Authentication);
|
||||||
|
|
||||||
|
return oauth2Authentication;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void setClientRegistrationRepository(ClientRegistrationRepository clientRegistrationRepository) {
|
public final void setClientRegistrationRepository(ClientRegistrationRepository clientRegistrationRepository) {
|
||||||
|
@ -140,6 +155,11 @@ public class OAuth2LoginAuthenticationFilter extends AbstractAuthenticationProce
|
||||||
this.authorizationRequestRepository = authorizationRequestRepository;
|
this.authorizationRequestRepository = authorizationRequestRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final void setAccessTokenRepository(OAuth2TokenRepository<AccessToken> accessTokenRepository) {
|
||||||
|
Assert.notNull(accessTokenRepository, "accessTokenRepository cannot be null");
|
||||||
|
this.accessTokenRepository = accessTokenRepository;
|
||||||
|
}
|
||||||
|
|
||||||
private AuthorizationResponse convert(HttpServletRequest request) {
|
private AuthorizationResponse convert(HttpServletRequest request) {
|
||||||
String code = request.getParameter(OAuth2Parameter.CODE);
|
String code = request.getParameter(OAuth2Parameter.CODE);
|
||||||
String errorCode = request.getParameter(OAuth2Parameter.ERROR);
|
String errorCode = request.getParameter(OAuth2Parameter.ERROR);
|
||||||
|
|
|
@ -27,8 +27,6 @@ import org.springframework.security.oauth2.client.authentication.jwt.JwtDecoderR
|
||||||
import org.springframework.security.oauth2.client.authentication.userinfo.OAuth2AuthenticationToken;
|
import org.springframework.security.oauth2.client.authentication.userinfo.OAuth2AuthenticationToken;
|
||||||
import org.springframework.security.oauth2.client.authentication.userinfo.OAuth2UserService;
|
import org.springframework.security.oauth2.client.authentication.userinfo.OAuth2UserService;
|
||||||
import org.springframework.security.oauth2.client.registration.ClientRegistration;
|
import org.springframework.security.oauth2.client.registration.ClientRegistration;
|
||||||
import org.springframework.security.oauth2.client.token.InMemoryAccessTokenRepository;
|
|
||||||
import org.springframework.security.oauth2.client.token.SecurityTokenRepository;
|
|
||||||
import org.springframework.security.oauth2.core.AccessToken;
|
import org.springframework.security.oauth2.core.AccessToken;
|
||||||
import org.springframework.security.oauth2.core.OAuth2Error;
|
import org.springframework.security.oauth2.core.OAuth2Error;
|
||||||
import org.springframework.security.oauth2.core.endpoint.AuthorizationRequest;
|
import org.springframework.security.oauth2.core.endpoint.AuthorizationRequest;
|
||||||
|
@ -61,7 +59,7 @@ import java.util.Collection;
|
||||||
* @author Joe Grandja
|
* @author Joe Grandja
|
||||||
* @since 5.0
|
* @since 5.0
|
||||||
* @see AuthorizationCodeAuthenticationToken
|
* @see AuthorizationCodeAuthenticationToken
|
||||||
* @see SecurityTokenRepository
|
* @see OAuth2AuthenticationToken
|
||||||
* @see OidcAuthorizedClient
|
* @see OidcAuthorizedClient
|
||||||
* @see OidcUserService
|
* @see OidcUserService
|
||||||
* @see OidcUser
|
* @see OidcUser
|
||||||
|
@ -75,7 +73,6 @@ public class OidcAuthorizationCodeAuthenticationProvider implements Authenticati
|
||||||
private final AuthorizationGrantTokenExchanger<AuthorizationCodeAuthenticationToken> authorizationCodeTokenExchanger;
|
private final AuthorizationGrantTokenExchanger<AuthorizationCodeAuthenticationToken> authorizationCodeTokenExchanger;
|
||||||
private final OAuth2UserService userService;
|
private final OAuth2UserService userService;
|
||||||
private final JwtDecoderRegistry jwtDecoderRegistry;
|
private final JwtDecoderRegistry jwtDecoderRegistry;
|
||||||
private SecurityTokenRepository<AccessToken> accessTokenRepository = new InMemoryAccessTokenRepository();
|
|
||||||
private GrantedAuthoritiesMapper authoritiesMapper = (authorities -> authorities);
|
private GrantedAuthoritiesMapper authoritiesMapper = (authorities -> authorities);
|
||||||
|
|
||||||
public OidcAuthorizationCodeAuthenticationProvider(
|
public OidcAuthorizationCodeAuthenticationProvider(
|
||||||
|
@ -151,10 +148,6 @@ public class OidcAuthorizationCodeAuthenticationProvider implements Authenticati
|
||||||
OidcAuthorizedClient authorizedClient = new OidcAuthorizedClient(
|
OidcAuthorizedClient authorizedClient = new OidcAuthorizedClient(
|
||||||
clientRegistration, idToken.getSubject(), accessToken, idToken);
|
clientRegistration, idToken.getSubject(), accessToken, idToken);
|
||||||
|
|
||||||
this.accessTokenRepository.saveSecurityToken(
|
|
||||||
authorizedClient.getAccessToken(),
|
|
||||||
authorizedClient.getClientRegistration());
|
|
||||||
|
|
||||||
OAuth2User oauth2User = this.userService.loadUser(authorizedClient);
|
OAuth2User oauth2User = this.userService.loadUser(authorizedClient);
|
||||||
|
|
||||||
// Update AuthorizedClient as the 'principalName' may have changed
|
// Update AuthorizedClient as the 'principalName' may have changed
|
||||||
|
@ -172,11 +165,6 @@ public class OidcAuthorizationCodeAuthenticationProvider implements Authenticati
|
||||||
return authenticationResult;
|
return authenticationResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void setAccessTokenRepository(SecurityTokenRepository<AccessToken> accessTokenRepository) {
|
|
||||||
Assert.notNull(accessTokenRepository, "accessTokenRepository cannot be null");
|
|
||||||
this.accessTokenRepository = accessTokenRepository;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void setAuthoritiesMapper(GrantedAuthoritiesMapper authoritiesMapper) {
|
public final void setAuthoritiesMapper(GrantedAuthoritiesMapper authoritiesMapper) {
|
||||||
Assert.notNull(authoritiesMapper, "authoritiesMapper cannot be null");
|
Assert.notNull(authoritiesMapper, "authoritiesMapper cannot be null");
|
||||||
this.authoritiesMapper = authoritiesMapper;
|
this.authoritiesMapper = authoritiesMapper;
|
||||||
|
|
Loading…
Reference in New Issue