如何在redis中存储spring安全会话信息?

时间:2012-11-03 17:24:20

标签: spring-security redis session-management

我在我的应用程序中使用Spring安全性进行身份验证和授权。我使用Neo4j数据库作为后端,并实现了userDetailsS​​ervice进行身份验证。

但是,每当我的应用程序重新启动时,用户都被迫再次登录。 为了解决这个问题,我想将会话信息存储在redis数据库中,并在应用程序启动时将数据加载到Spring安全上下文中。

如果有任何文章和指针要实现,请转发。

我正在考虑实施它, 1)对于每次成功的身份验证,请在redis中存储用户详细信息和会话详细信息 这必须在UserDetailsS​​ervice实现的loadUserByUsername()方法中实现 2)当用户注销时,从redis中删除数据,我在哪里可以获取此信息?有没有弹簧安全功能,我可以称之为 3)每当应用程序重新启动时,将所有数据从redis加载到spring安全性,再次在哪里需要编写此逻辑?

如果我遗漏了任何信息,请告诉我。

4 个答案:

答案 0 :(得分:2)

您需要做的就是实现

  • 将安全上下文存储处理为红色的SecurityContextRepository
  • 最终检索/存储会话信息的自定义过滤器(GenericFilterBean)

我认为可以只为标准过滤器提供一个不同的存储库,但我不确定,无论如何我都需要自己的实现...

答案 1 :(得分:2)

答案 2 :(得分:1)

您需要配置Spring Security的remember-me功能。

  

记住我或持久登录身份验证是指能够记住会话之间主体身份的网站。这通常通过向浏览器发送cookie来实现,在将来的会话期间检测到cookie并导致自动登录。 Spring Security为这些操作提供了必要的钩子,并且有两个具体的记住我实现。一个使用散列来保护基于cookie的令牌的安全性,另一个使用数据库或其他持久存储机制来存储生成的令牌。

Spring Security文档中提供了更多信息: http://static.springsource.org/spring-security/site/docs/3.1.x/reference/remember-me.html

您可以使用开箱即用的实现或注入您自己的(上述redis)。

答案 3 :(得分:0)

正如Luke Taylor所说,Tomcat的默认操作是在容器重启时序列化/反序列化会话。 Here

标准管理器的pathname属性是序列化文件的名称。如果您没有指定路径名称attirbute,则默认值为SESSIONS.SER 如果您不希望在重新启动时返回sesssions,则需要将其指定为空字符串值。