spring security + spring session 增加session 监听器
# spring security 为了避免重启服务后session过期,把session信息存到了redis中。但是找了网上好多资料,都不能正确监听session创建和销毁。特此记录:
package com.lenovo.biportal.utils.springsecurity;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class RedisSessionListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("sessionCreated-->" + se.getSession().getId());
    }
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("sessionDestroyed-->" + se.getSession().getId());
    }
}
package com.lenovo.biportal.utils.springsecurity;
import com.lenovo.biportal.PortalConfig;
import com.lenovo.biportal.utils.redis.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 7200)
public class SessionRedisConfig {
    @Bean
    public JedisConnectionFactory connectionFactory() {
        return new JedisConnectionFactory(getConfig());
    }
    private RedisStandaloneConfiguration getConfig() {
        Config redis = PortalConfig.getPortalConfig().getRedis();
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
        redisStandaloneConfiguration.setHostName(redis.getServerConfig().getHost());
        redisStandaloneConfiguration.setDatabase(redis.getDatabaseIndex());
        redisStandaloneConfiguration.setPassword(redis.getPassword());
        redisStandaloneConfiguration.setPort(redis.getServerConfig().getPort());
        return redisStandaloneConfiguration;
    }
    @Bean
    RedisSessionListener redisSessionListener() {
        return new RedisSessionListener();
    }
}
package com.lenovo.biportal.utils.springsecurity;
import com.lenovo.biportal.Application;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.session.FindByIndexNameSessionRepository;
import org.springframework.session.Session;
import org.springframework.session.security.SpringSessionBackedSessionRegistry;
@org.springframework.context.annotation.Configuration
@Import({ SessionRedisConfig.class })
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class Configuration<S extends Session> extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserDetailsService userDetailsService;
    @Bean
    PasswordEncoder password() {
        return new BCryptPasswordEncoder();
    }
    @Autowired
    private FindByIndexNameSessionRepository<S> sessionRepository;
    @Bean
    SpringSessionBackedSessionRegistry<S> sessionRegistry() {
        return new SpringSessionBackedSessionRegistry<S>(this.sessionRepository);
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin()
                .loginPage("/default/adfs/login/page")
                .permitAll()
                .and().authorizeRequests()
                .antMatchers("/swagger-ui.html").hasRole("developer")
                .antMatchers("/default/adfs/login",
                        "/default/adfs/login/page",
                        "/default/adfs/logout",
                        "/default/adfs/userinfo",
                        "/default/adfs/user/photo",
                        "/api/auth/pseudo/login",
                        "/app/status",
                        "/favicon.ico",
                        "/pbi/oauth",
                        "/statistics/prelogin",
                        "/statistics/today/prelogin",
                        "/*.js",
                        "/*.css",
                        "/*.png",
                        "/*.woff",
                        "/*.jpg",
                        "/*.eot",
                        "/*.ttf",
                        "/*.svg",
                        "/*.map",
                        "/*.txt",
                        "/index.html"
                ).permitAll()
                .anyRequest()
                .authenticated()
                .and()
                .sessionManagement()
                .maximumSessions(1)
                .sessionRegistry(sessionRegistry())
        ;
        if (Application.isInTestMode()) {
            http.csrf().disable();
        }
    }
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(password());
    }
}
以上三个文件保证了用户登录的session信息写入redis,并且能正确监听session创建和销毁的事件。
                    
                
                
            
        
浙公网安备 33010602011771号