|
|
|
@ -19,6 +19,7 @@ import java.util.UUID; |
|
|
|
|
|
|
|
|
|
|
|
import org.springframework.security.authentication.AuthenticationManager; |
|
|
|
import org.springframework.security.authentication.AuthenticationManager; |
|
|
|
import org.springframework.security.authentication.RememberMeAuthenticationProvider; |
|
|
|
import org.springframework.security.authentication.RememberMeAuthenticationProvider; |
|
|
|
|
|
|
|
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; |
|
|
|
import org.springframework.security.config.annotation.web.HttpSecurityBuilder; |
|
|
|
import org.springframework.security.config.annotation.web.HttpSecurityBuilder; |
|
|
|
import org.springframework.security.config.annotation.web.builders.HttpSecurity; |
|
|
|
import org.springframework.security.config.annotation.web.builders.HttpSecurity; |
|
|
|
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; |
|
|
|
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; |
|
|
|
@ -43,8 +44,7 @@ import org.springframework.security.web.authentication.ui.DefaultLoginPageGenera |
|
|
|
* The following Filters are populated |
|
|
|
* The following Filters are populated |
|
|
|
* |
|
|
|
* |
|
|
|
* <ul> |
|
|
|
* <ul> |
|
|
|
* <li> |
|
|
|
* <li>{@link RememberMeAuthenticationFilter}</li> |
|
|
|
* {@link RememberMeAuthenticationFilter}</li> |
|
|
|
|
|
|
|
* </ul> |
|
|
|
* </ul> |
|
|
|
* |
|
|
|
* |
|
|
|
* <h2>Shared Objects Created</h2> |
|
|
|
* <h2>Shared Objects Created</h2> |
|
|
|
@ -69,7 +69,7 @@ import org.springframework.security.web.authentication.ui.DefaultLoginPageGenera |
|
|
|
* <li>{@link AuthenticationManager}</li> |
|
|
|
* <li>{@link AuthenticationManager}</li> |
|
|
|
* <li>{@link UserDetailsService} if no {@link #userDetailsService(UserDetailsService)} |
|
|
|
* <li>{@link UserDetailsService} if no {@link #userDetailsService(UserDetailsService)} |
|
|
|
* was specified.</li> |
|
|
|
* was specified.</li> |
|
|
|
* <li> {@link DefaultLoginPageGeneratingFilter} - if present will be populated with |
|
|
|
* <li>{@link DefaultLoginPageGeneratingFilter} - if present will be populated with |
|
|
|
* information from the configuration</li> |
|
|
|
* information from the configuration</li> |
|
|
|
* </ul> |
|
|
|
* </ul> |
|
|
|
* |
|
|
|
* |
|
|
|
@ -77,8 +77,8 @@ import org.springframework.security.web.authentication.ui.DefaultLoginPageGenera |
|
|
|
* @author Eddú Meléndez |
|
|
|
* @author Eddú Meléndez |
|
|
|
* @since 3.2 |
|
|
|
* @since 3.2 |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public final class RememberMeConfigurer<H extends HttpSecurityBuilder<H>> extends |
|
|
|
public final class RememberMeConfigurer<H extends HttpSecurityBuilder<H>> |
|
|
|
AbstractHttpConfigurer<RememberMeConfigurer<H>, H> { |
|
|
|
extends AbstractHttpConfigurer<RememberMeConfigurer<H>, H> { |
|
|
|
private AuthenticationSuccessHandler authenticationSuccessHandler; |
|
|
|
private AuthenticationSuccessHandler authenticationSuccessHandler; |
|
|
|
private String key; |
|
|
|
private String key; |
|
|
|
private RememberMeServices rememberMeServices; |
|
|
|
private RememberMeServices rememberMeServices; |
|
|
|
@ -90,6 +90,7 @@ public final class RememberMeConfigurer<H extends HttpSecurityBuilder<H>> extend |
|
|
|
private UserDetailsService userDetailsService; |
|
|
|
private UserDetailsService userDetailsService; |
|
|
|
private Integer tokenValiditySeconds; |
|
|
|
private Integer tokenValiditySeconds; |
|
|
|
private Boolean useSecureCookie; |
|
|
|
private Boolean useSecureCookie; |
|
|
|
|
|
|
|
private Boolean alwaysRemember; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Creates a new instance |
|
|
|
* Creates a new instance |
|
|
|
@ -183,10 +184,12 @@ public final class RememberMeConfigurer<H extends HttpSecurityBuilder<H>> extend |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* The name of cookie which store the token for remember me authentication. Defaults to 'remember-me'. |
|
|
|
* The name of cookie which store the token for remember me authentication. Defaults |
|
|
|
|
|
|
|
* to 'remember-me'. |
|
|
|
* |
|
|
|
* |
|
|
|
* @param rememberMeCookieName the name of cookie which store the token for remember me authentication |
|
|
|
* @param rememberMeCookieName the name of cookie which store the token for remember |
|
|
|
* @return the {@link RememberMeConfigurer} for further customization |
|
|
|
* me authentication |
|
|
|
|
|
|
|
* @return the {@link RememberMeConfigurer} for further customization |
|
|
|
* @since 4.0.1 |
|
|
|
* @since 4.0.1 |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public RememberMeConfigurer<H> rememberMeCookieName(String rememberMeCookieName) { |
|
|
|
public RememberMeConfigurer<H> rememberMeCookieName(String rememberMeCookieName) { |
|
|
|
@ -197,7 +200,8 @@ public final class RememberMeConfigurer<H extends HttpSecurityBuilder<H>> extend |
|
|
|
/** |
|
|
|
/** |
|
|
|
* The domain name within which the remember me cookie is visible. |
|
|
|
* The domain name within which the remember me cookie is visible. |
|
|
|
* |
|
|
|
* |
|
|
|
* @param rememberMeCookieDomain the domain name within which the remember me cookie is visible. |
|
|
|
* @param rememberMeCookieDomain the domain name within which the remember me cookie |
|
|
|
|
|
|
|
* is visible. |
|
|
|
* @return the {@link RememberMeConfigurer} for further customization |
|
|
|
* @return the {@link RememberMeConfigurer} for further customization |
|
|
|
* @since 4.1.0 |
|
|
|
* @since 4.1.0 |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
@ -244,8 +248,8 @@ public final class RememberMeConfigurer<H extends HttpSecurityBuilder<H>> extend |
|
|
|
RememberMeServices rememberMeServices = getRememberMeServices(http, key); |
|
|
|
RememberMeServices rememberMeServices = getRememberMeServices(http, key); |
|
|
|
http.setSharedObject(RememberMeServices.class, rememberMeServices); |
|
|
|
http.setSharedObject(RememberMeServices.class, rememberMeServices); |
|
|
|
LogoutConfigurer<H> logoutConfigurer = http.getConfigurer(LogoutConfigurer.class); |
|
|
|
LogoutConfigurer<H> logoutConfigurer = http.getConfigurer(LogoutConfigurer.class); |
|
|
|
if (logoutConfigurer != null && logoutHandler != null) { |
|
|
|
if (logoutConfigurer != null && this.logoutHandler != null) { |
|
|
|
logoutConfigurer.addLogoutHandler(logoutHandler); |
|
|
|
logoutConfigurer.addLogoutHandler(this.logoutHandler); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
RememberMeAuthenticationProvider authenticationProvider = new RememberMeAuthenticationProvider( |
|
|
|
RememberMeAuthenticationProvider authenticationProvider = new RememberMeAuthenticationProvider( |
|
|
|
@ -259,10 +263,11 @@ public final class RememberMeConfigurer<H extends HttpSecurityBuilder<H>> extend |
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void configure(H http) throws Exception { |
|
|
|
public void configure(H http) throws Exception { |
|
|
|
RememberMeAuthenticationFilter rememberMeFilter = new RememberMeAuthenticationFilter( |
|
|
|
RememberMeAuthenticationFilter rememberMeFilter = new RememberMeAuthenticationFilter( |
|
|
|
http.getSharedObject(AuthenticationManager.class), rememberMeServices); |
|
|
|
http.getSharedObject(AuthenticationManager.class), |
|
|
|
if (authenticationSuccessHandler != null) { |
|
|
|
this.rememberMeServices); |
|
|
|
|
|
|
|
if (this.authenticationSuccessHandler != null) { |
|
|
|
rememberMeFilter |
|
|
|
rememberMeFilter |
|
|
|
.setAuthenticationSuccessHandler(authenticationSuccessHandler); |
|
|
|
.setAuthenticationSuccessHandler(this.authenticationSuccessHandler); |
|
|
|
} |
|
|
|
} |
|
|
|
rememberMeFilter = postProcess(rememberMeFilter); |
|
|
|
rememberMeFilter = postProcess(rememberMeFilter); |
|
|
|
http.addFilter(rememberMeFilter); |
|
|
|
http.addFilter(rememberMeFilter); |
|
|
|
@ -273,7 +278,7 @@ public final class RememberMeConfigurer<H extends HttpSecurityBuilder<H>> extend |
|
|
|
* @return the HTTP parameter used to indicate to remember the user |
|
|
|
* @return the HTTP parameter used to indicate to remember the user |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
private String getRememberMeParameter() { |
|
|
|
private String getRememberMeParameter() { |
|
|
|
return rememberMeParameter; |
|
|
|
return this.rememberMeParameter; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
@ -297,29 +302,34 @@ public final class RememberMeConfigurer<H extends HttpSecurityBuilder<H>> extend |
|
|
|
* @return the {@link RememberMeServices} to use |
|
|
|
* @return the {@link RememberMeServices} to use |
|
|
|
* @throws Exception |
|
|
|
* @throws Exception |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
private RememberMeServices getRememberMeServices(H http, String key) throws Exception { |
|
|
|
private RememberMeServices getRememberMeServices(H http, String key) |
|
|
|
if (rememberMeServices != null) { |
|
|
|
throws Exception { |
|
|
|
if (rememberMeServices instanceof LogoutHandler && logoutHandler == null) { |
|
|
|
if (this.rememberMeServices != null) { |
|
|
|
this.logoutHandler = (LogoutHandler) rememberMeServices; |
|
|
|
if (this.rememberMeServices instanceof LogoutHandler |
|
|
|
|
|
|
|
&& this.logoutHandler == null) { |
|
|
|
|
|
|
|
this.logoutHandler = (LogoutHandler) this.rememberMeServices; |
|
|
|
} |
|
|
|
} |
|
|
|
return rememberMeServices; |
|
|
|
return this.rememberMeServices; |
|
|
|
} |
|
|
|
} |
|
|
|
AbstractRememberMeServices tokenRememberMeServices = createRememberMeServices( |
|
|
|
AbstractRememberMeServices tokenRememberMeServices = createRememberMeServices( |
|
|
|
http, key); |
|
|
|
http, key); |
|
|
|
tokenRememberMeServices.setParameter(rememberMeParameter); |
|
|
|
tokenRememberMeServices.setParameter(this.rememberMeParameter); |
|
|
|
tokenRememberMeServices.setCookieName(rememberMeCookieName); |
|
|
|
tokenRememberMeServices.setCookieName(this.rememberMeCookieName); |
|
|
|
if (rememberMeCookieDomain != null) { |
|
|
|
if (this.rememberMeCookieDomain != null) { |
|
|
|
tokenRememberMeServices.setCookieDomain(rememberMeCookieDomain); |
|
|
|
tokenRememberMeServices.setCookieDomain(this.rememberMeCookieDomain); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (this.tokenValiditySeconds != null) { |
|
|
|
|
|
|
|
tokenRememberMeServices.setTokenValiditySeconds(this.tokenValiditySeconds); |
|
|
|
} |
|
|
|
} |
|
|
|
if (tokenValiditySeconds != null) { |
|
|
|
if (this.useSecureCookie != null) { |
|
|
|
tokenRememberMeServices.setTokenValiditySeconds(tokenValiditySeconds); |
|
|
|
tokenRememberMeServices.setUseSecureCookie(this.useSecureCookie); |
|
|
|
} |
|
|
|
} |
|
|
|
if (useSecureCookie != null) { |
|
|
|
if (this.alwaysRemember != null) { |
|
|
|
tokenRememberMeServices.setUseSecureCookie(useSecureCookie); |
|
|
|
tokenRememberMeServices.setAlwaysRemember(this.alwaysRemember); |
|
|
|
} |
|
|
|
} |
|
|
|
tokenRememberMeServices.afterPropertiesSet(); |
|
|
|
tokenRememberMeServices.afterPropertiesSet(); |
|
|
|
logoutHandler = tokenRememberMeServices; |
|
|
|
this.logoutHandler = tokenRememberMeServices; |
|
|
|
rememberMeServices = tokenRememberMeServices; |
|
|
|
this.rememberMeServices = tokenRememberMeServices; |
|
|
|
return tokenRememberMeServices; |
|
|
|
return tokenRememberMeServices; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -335,7 +345,8 @@ public final class RememberMeConfigurer<H extends HttpSecurityBuilder<H>> extend |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
private AbstractRememberMeServices createRememberMeServices(H http, String key) |
|
|
|
private AbstractRememberMeServices createRememberMeServices(H http, String key) |
|
|
|
throws Exception { |
|
|
|
throws Exception { |
|
|
|
return tokenRepository == null ? createTokenBasedRememberMeServices(http, key) |
|
|
|
return this.tokenRepository == null |
|
|
|
|
|
|
|
? createTokenBasedRememberMeServices(http, key) |
|
|
|
: createPersistentRememberMeServices(http, key); |
|
|
|
: createPersistentRememberMeServices(http, key); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -363,7 +374,7 @@ public final class RememberMeConfigurer<H extends HttpSecurityBuilder<H>> extend |
|
|
|
String key) { |
|
|
|
String key) { |
|
|
|
UserDetailsService userDetailsService = getUserDetailsService(http); |
|
|
|
UserDetailsService userDetailsService = getUserDetailsService(http); |
|
|
|
return new PersistentTokenBasedRememberMeServices(key, userDetailsService, |
|
|
|
return new PersistentTokenBasedRememberMeServices(key, userDetailsService, |
|
|
|
tokenRepository); |
|
|
|
this.tokenRepository); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
@ -375,16 +386,15 @@ public final class RememberMeConfigurer<H extends HttpSecurityBuilder<H>> extend |
|
|
|
* @return the {@link UserDetailsService} to use |
|
|
|
* @return the {@link UserDetailsService} to use |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
private UserDetailsService getUserDetailsService(H http) { |
|
|
|
private UserDetailsService getUserDetailsService(H http) { |
|
|
|
if (userDetailsService == null) { |
|
|
|
if (this.userDetailsService == null) { |
|
|
|
userDetailsService = http.getSharedObject(UserDetailsService.class); |
|
|
|
this.userDetailsService = http.getSharedObject(UserDetailsService.class); |
|
|
|
} |
|
|
|
} |
|
|
|
if (userDetailsService == null) { |
|
|
|
if (this.userDetailsService == null) { |
|
|
|
throw new IllegalStateException( |
|
|
|
throw new IllegalStateException("userDetailsService cannot be null. Invoke " |
|
|
|
"userDetailsService cannot be null. Invoke " |
|
|
|
+ RememberMeConfigurer.class.getSimpleName() |
|
|
|
+ RememberMeConfigurer.class.getSimpleName() |
|
|
|
+ "#userDetailsService(UserDetailsService) or see its javadoc for alternative approaches."); |
|
|
|
+ "#userDetailsService(UserDetailsService) or see its javadoc for alternative approaches."); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
return userDetailsService; |
|
|
|
return this.userDetailsService; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
@ -394,9 +404,9 @@ public final class RememberMeConfigurer<H extends HttpSecurityBuilder<H>> extend |
|
|
|
* @return the remember me key to use |
|
|
|
* @return the remember me key to use |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
private String getKey() { |
|
|
|
private String getKey() { |
|
|
|
if (key == null) { |
|
|
|
if (this.key == null) { |
|
|
|
key = UUID.randomUUID().toString(); |
|
|
|
this.key = UUID.randomUUID().toString(); |
|
|
|
} |
|
|
|
} |
|
|
|
return key; |
|
|
|
return this.key; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |