WebSecurityBeanProvider.java
package com.seebie.server.security;
import com.seebie.server.AppProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.event.LoggerListener;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.RememberMeServices;
import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl;
import org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices;
import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;
import javax.sql.DataSource;
import static com.seebie.server.security.WebSecurityConfig.REMEMBER_ME_COOKIE;
@Configuration
public class WebSecurityBeanProvider {
private AppProperties.Security.RememberMe rememberMeConfig;
public WebSecurityBeanProvider(AppProperties app) {
rememberMeConfig = app.security().rememberMe();
}
/**
* This is a bean that listens for all authentication events and logs them.
*
* Alternatively, we could use the @EventListener annotation on a method in a @Component class
* to listen e.g. for AuthenticationSuccessEvent and other specific events.
* That approach also requires that an AuthenticationEventPublisher Bean be defined.
*/
@Bean
public LoggerListener createLoggerListener() {
return new LoggerListener();
}
@Bean
public PasswordEncoder createPasswordEncoder() {
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}
@Bean
public PersistentTokenRepository persistentTokenRepository(DataSource dataSource) {
JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
tokenRepository.setDataSource(dataSource);
return tokenRepository;
}
@Bean
public RememberMeServices rememberMeServices(PersistentTokenRepository persistentTokenRepo, UserDetailsService userDetailsService) {
var rememberMe = new PersistentTokenBasedRememberMeServices(rememberMeConfig.key(), userDetailsService, persistentTokenRepo);
rememberMe.setParameter(REMEMBER_ME_COOKIE);
rememberMe.setTokenValiditySeconds(rememberMeConfig.tokenValiditySeconds());
rememberMe.setCookieName(REMEMBER_ME_COOKIE);
rememberMe.setUseSecureCookie(true);
return rememberMe;
}
}