β

spring boot spring security 访问并发控制

java web asdtiang 8 阅读

基于spring boot , spring security ,spring session实现session的并发控制 ,即Spring Security Concurrent Session Control 同一用户访问并发控制。

  • AIR MAX 2016
  • 单节点比较好处理,关键是分布式环境下怎么实现 。 单节点请参考官方文档: http://docs.spring.io/spring-session/docs/current-SNAPSHOT/reference/html5/#spring-security-concurrent-sessions spring session。 asics beyond damskie 文档地址: http://docs.spring.io/spring-session/docs/ spring session 可以将session存储到指定的地方以及指定认证机制,存储已经实现的有数据库,redis等。 详细官方文档以及示例代码。 adidas tubular rouge 认证可以基于cookie,rest api时可以基于header头部。 这些默认都已经实现 ,只需要简单配置。 redis配置示例配置如下(基于spring boot,spring data redis实现):

    import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.security.web.session.HttpSessionEventPublisher; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; import org.springframework.session.web.http.HeaderHttpSessionStrategy; import org.springframework.session.web.http.HttpSessionStrategy; @Configuration @EnableRedisHttpSession public class HttpSessionConfig { @Bean public HttpSessionStrategy httpSessionStrategy() { return new HeaderHttpSessionStrategy(); //基于header认证 } @Bean public JedisConnectionFactory connectionFactory() { return new JedisConnectionFactory(); //redis连接 } @Bean public HttpSessionEventPublisher httpSessionEventPublisher() { return new HttpSessionEventPublisher(); //session事件发布 } }

    这样可以实现session的集中式管理,存储为redis,基于header 认证。 下一个问题,如何控制同一用户同时能登录多少个客户端,即并发session控制。 单节点环境spring session 基于内存已经实现。相关类为: org.springframework.security.core.session.SessionRegistryImpl 但基于redis如何实现呢?经过查看资料,已经有实现的代码: https://github.com/asdtiang/spring-session-concurrent-session-control 注意spring session使用最新的即可,我的版本是1.3。 spring boot配置如下:

    @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired RedisOperationsSessionRepository redisOperationsSessionRepository; @Bean SpringSessionBackedSessionRegistry sessionRegistry() { return new SpringSessionBackedSessionRegistry(redisOperationsSessionRepository); } protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests().and() .formLogin() .defaultSuccessUrl("/").loginPage("/login").permitAll().and().logout().permitAll().and() .authorizeRequests().antMatchers("/**/**").permitAll() .and() .sessionManagement().maximumSessions(1).sessionRegistry(sessionRegistry()).maxSessionsPreventsLogin(true) .and() .authorizeRequests().and().csrf().disable(); } }

    注意,经过测试

    maxSessionsPreventsLogin

    配置没有管用,但我们可以通过

    SpringSessionBackedSessionRegistry //SessionRegistry 实例

    获取指定用户的session数量。在需要使用的地方直接注入即可。 @Autowired SessionRegistry sessionRegistry; 通过: log.info(“session count includeExpiredSessions true ,username:{},session:{}”,username,sessionRegistry.getAllSessions(“admin”, true).size()); log.info(“session count includeExpiredSessions false,username:{},session:{}”,username,sessionRegistry.getAllSessions(“admin”, false).size()); 获取session数量。 username即用户名,这个和登录时设置的用户名保持一致即可。 具体怎么查看redis里面的存储格式,可以通过 文档进行查看: http://docs.spring.io/spring-session/docs/current-SNAPSHOT/reference/html5/#api-redisoperationssessionrepository 原理就是将session信息存入redis,信息包括认证key(uuid),过期时间,用户名,等。

    作者:java web asdtiang
    java 搜索解决方案和实现 需求分析 解决方案 方案实现
    原文地址:spring boot spring security 访问并发控制, 感谢原作者分享。

    发表评论