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;
    }
}