gpt4 book ai didi

java - 将 spring-session 和 Redis 添加到现有的 Spring Boot Spring Security 配置中

转载 作者:行者123 更新时间:2023-11-30 11:08:22 27 4
gpt4 key购买 nike

目前我们有一个成功运行 spring-security 的 spring-boot (1.2.1.RELEASE) 应用程序。

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

@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();
}
}
}

如果您尝试在 2 个不同的 session 中使用相同的用户帐户登录,第二次尝试将失败,直到当前用户按预期和要求注销。

这在单实例环境中效果很好,但我们想部署到 Herkou 上的多个 dyno,因此需要将 session 外部化。

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

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

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

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

添加注解@EnableRedisHttpSession后,SessionRegistryImpl方法永远不会被调用,HttpSessionEventPublisher.sessionCreated()/sessionDestroy() 方法。

这意味着当当前用户注销时,其他尝试使用该用户名的 session 仍将无法登录,而刚刚注销的用户将无法重新登录。这是因为 session 永远不会从 ???registry/repository???

中删除

任何关于如何让我的 session 创建/销毁工作,同时使用 redis 作为存储的见解将不胜感激。

最佳答案

我们目前不支持 Spring Security 的并发控制和 Spring Session。你可以找到一个 existing issue在 GitHub 上。

总体思路是使用 Spring Session 的 SessionRepository 接口(interface)实现 Spring Security 的 SessionRepository 接口(interface)。

如果您想提交 PR,我们将不胜感激!

关于java - 将 spring-session 和 Redis 添加到现有的 Spring Boot Spring Security 配置中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28588587/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com