Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 增加春季课程&;Redis到现有的Spring引导Spring安全配置_Java_Spring Boot_Spring Security_Spring Session - Fatal编程技术网

Java 增加春季课程&;Redis到现有的Spring引导Spring安全配置

Java 增加春季课程&;Redis到现有的Spring引导Spring安全配置,java,spring-boot,spring-security,spring-session,Java,Spring Boot,Spring Security,Spring Session,目前我们有一个SpringBoot(1.2.1.RELEASE)应用程序,SpringSecurity正在成功运行 我们已经通过以下配置成功地实现了并发控制 @Configuration @EnableGlobalMethodSecurity(securedEnabled = true) public class SecurityConfig { @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) @Configuration

目前我们有一个SpringBoot(1.2.1.RELEASE)应用程序,SpringSecurity正在成功运行

我们已经通过以下配置成功地实现了并发控制

@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfig {

    @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
    @Configuration
    protected static class ApplicationSecurity extends WebSecurityConfigurerAdapter {

        private static final int MAX_CONCURRENT_USER_SESSIONS = 1;

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                    //snipped
                    .sessionManagement()
                    .maximumSessions(MAX_CONCURRENT_USER_SESSIONS)
                    .maxSessionsPreventsLogin(true)
                    .sessionRegistry(sessionRegistry());
        }

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

        @Bean
        public static HttpSessionEventPublisher httpSessionEventPublisher() {
            return new HttpSessionEventPublisher();
        }
    }
}
如果您尝试在两个不同会话上使用相同的用户帐户登录,则第二次尝试将失败,直到当前用户按预期和要求注销为止

这在单实例环境中非常有效,但我们希望部署到Herkou上的多个dyno,因此需要将会话外部化

spring session+spring boot starter redis似乎是一个很好的选择

从spring会话文档中,它提到我们需要做的就是添加注释
@EnableRedisHttpSession
,并定义一个
JedisConnectionFactory

这确实有效,添加注释会导致会话存储在Redis中,我可以使用Redis cli看到这一点

但是,添加此注释会破坏并发控制

添加注释
@enableRedistpSession
后,将永远不会调用
SessionRegistryImpl
方法,也不会调用
HttpSessionEventPublisher.sessionCreated()/sessionDestroy()
方法

这意味着当当前用户注销时,尝试使用该用户名的其他会话仍将无法登录,而刚刚注销的用户将无法重新登录。这是因为会话从未从注册表/存储库中删除


如果能深入了解如何在使用redis作为存储的同时创建/销毁会话,我将不胜感激。

我们目前不支持Spring Security的并发控制和Spring会话。您可以在GitHub上找到一个

总体思路是使用Spring会话的SessionRepository接口实现Spring Security的SessionRepository接口

如果你想提交一份公关,我们将不胜感激