java - 使用 Redis 限制 Spring Boot 中的 session

标签 java spring spring-boot spring-security

我使用 Spring boot 和 Redis 来验证用户身份。

我的应用程序首次使用用户名和密码对用户进行身份验证,并发回唯一的 token 。对于进一步的交易,用户在 header 中发送 token 。

这很好用,但是当用户已经通过身份验证并且在 Redis 中拥有 token 时,我不希望 spring 创建新 token 。

设置:Spring Boot:1.4.0; Java 1.8

我确实尝试了以下方法,但它不起作用。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter 
{   
  @Autowired
  private CustomAuthenticationProvider authProvider;

  @Bean
  public HttpSessionStrategy httpSessionStrategy() 
  {
     return new HeaderHttpSessionStrategy();
  }

   @Autowired
  public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception 
  {
     auth.authenticationProvider(authProvider);
  }

  @Override
  protected void configure(HttpSecurity http) throws Exception 
  {
    http
        .authorizeRequests()
        .anyRequest().authenticated()                       
        .and()
        .requestCache()
        .requestCache(new NullRequestCache())
        .and()
        .httpBasic()
        .and()
        .sessionManagement()
        .maximumSessions(1)
        .maxSessionsPreventsLogin(true)
        .sessionRegistry(sessionRegistry());
  }


  @Bean
  public SessionRegistry sessionRegistry() 
  {
     SessionRegistry sessionRegistry = new SessionRegistryImpl();
     return sessionRegistry;
  }

  @Bean
  public static HttpSessionEventPublisher httpSessionEventPublisher() 
  {
     return new HttpSessionEventPublisher();
  }   
}

最佳答案

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

        @Autowired
        FindByIndexNameSessionRepository<ExpiringSession> sessionRepository;

        @Override
        protected void configure(HttpSecurity http) throws Exception {
                http
                        // other config goes here...
                        .sessionManagement()
                                .maximumSessions(1)
                                .sessionRegistry(sessionRegistry());
        }

        @Bean
        SpringSessionBackedSessionRegistry sessionRegistry() {
                return new SpringSessionBackedSessionRegistry(this.sessionRepository);
        }
}

更多详情请参阅here

关于java - 使用 Redis 限制 Spring Boot 中的 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41545105/

相关文章:

java - Spring 3.0 将文件作为资源注入(inject)

java - 当我从 @RestControler 返回对象时,如何在 json 中保留 map 键顺序

java - Spring Boot 外部配置和一次性测试

java - 将监听器与线程一起使用

java - 在请求正文中使用时配置属性不会 Autowiring ?

java - 用 O(nlogn) 时间 O(1) 空间有效地计算数组中等值对的数量

java - 如何使用 Spring 安全更新过滤器的 header 参数?

java - 我可以使用 HandshakeInterceptor 和 graphql-spring-boot-starter 来获取 Cookie 吗?

java - REST API : org. springframework.beans.factory.UnsatisfiedDependencyException:

java - 仅用于应用程序二进制文件的 Docker 容器