当Spring Security对用户进行身份validation时,如何在会话中管理自定义用户对象?

当Spring Security对用户进行身份validation时,它会创建一个UserDetail对象,并且可以在web-app中查找当前的UserId。 但是,假设我想保留一个带有首选项和其他详细信息的自定义用户对象以及UserDetails或Replacing UserDetails。

那么,当Spring Security成功validation时,如何向会话添加自定义用户对象? 以及如何在Spring Security注销登录用户时从会话中删除自定义用户对象。

或者有任何适当的方法来做到这一点?

执行此操作的最佳方法是让您的某个服务(可能是UserService)实现UserDetailsS​​ervice,并在spring安全性XML中指定您希望使用自己的用户详细信息服务。

UserDetailsS​​ervice需要做的是实现loadByUsername(String username)方法。 此方法需要返回一个实现UserDetails的类。 这可以是您自己的自定义对象存储您喜欢的任何内容。 这样做的好处是您可以通过spring security taglib从JSP访问对象的属性,并且它也始终可以从Spring Security Text中的SecurityContextHolder单例(线程安全)中获得。

以下是文档的链接: spring security manual,第8章这是一篇关于为密码加密实现自定义用户详细信息服务的博客文章: 示例用法

希望这可以帮助

编辑:忘记提及在注销时将从安全上下文和会话中删除该对象。 这是最有用的,它完全由春季安全管理。

你肯定需要编写自己的UserDetailService 。 在Principal对象中有用户, AuthenticationToken中还有一个Details对象,您可以存储其他登录信息的Map(String,String)。

 public class RequestFormDeatils extends SpringSecurityFilter { protected void doFilterHttp(HttpServletRequest request, ...) { SecurityContext sec = SecurityContextHolder.getContent(); AbstractAuthenticationToken auth = (AbstractAuthenticationToken)sec.getAuthentication(); Map m = new HashMap; m.put("myCustom1", request.getParameter("myCustom1")); m.put("myCustom2", request.getParameter("myCustom2")); auth.setDetails(m); } 

现在,您的代码中的任何位置都可以使用SecurityContext传播此安全相关信息,而无需将其耦合到UserDetails对象,或将其作为参数传递。 我在Spring Security Filter链的末尾的SecurityFilter中执行此代码。

    

删除用户时将删除此信息(如注销时)。