我在我的应用程序中使用Spring安全性进行身份验证和授权。我使用Neo4j数据库作为后端,并实现了userDetailsService进行身份验证。
但是,每当我的应用程序重新启动时,用户都被迫再次登录。 为了解决这个问题,我想将会话信息存储在redis数据库中,并在应用程序启动时将数据加载到Spring安全上下文中。
如果有任何文章和指针要实现,请转发。
我正在考虑实施它, 1)对于每次成功的身份验证,请在redis中存储用户详细信息和会话详细信息 这必须在UserDetailsService实现的loadUserByUsername()方法中实现 2)当用户注销时,从redis中删除数据,我在哪里可以获取此信息?有没有弹簧安全功能,我可以称之为 3)每当应用程序重新启动时,将所有数据从redis加载到spring安全性,再次在哪里需要编写此逻辑?
如果我遗漏了任何信息,请告诉我。
答案 0 :(得分:2)
您需要做的就是实现
我认为可以只为标准过滤器提供一个不同的存储库,但我不确定,无论如何我都需要自己的实现...
答案 1 :(得分:2)
在redis中存储会话现在是开箱即用的功能
http://docs.spring.io/spring-session/docs/current/reference/html5/guides/httpsession.html
答案 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,则需要将其指定为空字符串值。