Seguridad de Primavera, el usuario remoto se vuelve nulo después de que expire la sesión.
Aquí está mi configuración de seguridad de Spring.
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
private String sLogoutUrl_;
private String sLoginPage_;
private String sLoginSuccessUrl_;
public WebSecurityConfig() {
sLogoutUrl_ = LnProperty.getSecurity(LnProperty.LOGOUTURL);
sLoginPage_ = LnProperty.getSecurity(LnProperty.LOGINPAGE);
sLoginSuccessUrl_ = LnProperty.getSecurity(LnProperty.LOGINSUCCESSURL);
}
@Autowired
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(username -> {
TomcatUser tomcatUser = LnProperty.getUser(username);
if (tomcatUser == null) {
throw new UsernameNotFoundException(username);
}
return new User(username, passwordEncoder().encode(tomcatUser.getPassword()), tomcatUser.getRoles());
});
}
@Override
protected void configure(final HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers("**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage(sLoginPage_)
.loginProcessingUrl(sLoginPage_)
.defaultSuccessUrl(sLoginSuccessUrl_, true)
.failureHandler(authenticationFailureHandler(sLoginPage_))
.and()
.logout()
.logoutUrl(sLogoutUrl_)
.logoutSuccessHandler(logoutSuccessHandler(sLoginPage_))
.deleteCookies("JSESSIONID");
}
@Bean
public AuthenticationFailureHandler authenticationFailureHandler(String failureUrl) {
return new CustomAuthenticationFailureHandler(failureUrl);
}
@Bean
public LogoutSuccessHandler logoutSuccessHandler(String successUrl) {
return new CustomLogoutSuccessHandler(successUrl);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Intenté agregar esto a http
pero no funcionó.
.and()
.rememberMe()
.alwaysRemember(true);
¿Hay alguna manera de permanecer conectado incluso después de que se agote la sesión? Está bien si los atributos de sesión se borran, pero quiero que el usuario remoto no se anule después de que se agote la sesión. Solo desconecte al usuario si se ingresa la URL de desconexión, se cierra el navegador o se eliminan las cookies / cachés.
davy.ai
Sí, hay una forma de mantener la sesión iniciada incluso después del tiempo de espera en Spring Security. Puedes usar la autenticación de recordar sesión persistente agregando el siguiente código a tu método
configure()
:Esto creará un repositorio de token persistente y establecerá el tiempo de validez del token en 86400 segundos (1 día). El
userDetailsService
se usa para cargar los datos del usuario cuando se presenta un token.También necesitas crear un repositorio de token persistente implementando la interfaz
PersistentTokenRepository
. Aquí hay un ejemplo:Esta implementación de
PersistentTokenRepository
utiliza JDBC para almacenar los tokens en una tabla de base de datos llamadapersistent_logins
. Puedes personalizarla para usar cualquier otro mecanismo de almacenamiento que prefieras.Con esta configuración, el usuario permanecerá iniciado en sesión incluso después del tiempo de espera siempre y cuando la cookie de recordar sesión aún sea válida.