【问题标题】:How to manage a custom user object in session when Spring Security authenticates user?Spring Security对用户进行身份验证时如何在会话中管理自定义用户对象?
【发布时间】:2010-12-24 09:15:55
【问题描述】:

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

那么,当 Spring Security 进行身份验证时,如何将自定义用户对象添加到会话中 成功地?以及当 Spring Security 注销登录用户时如何从会话中删除自定义用户对象。

或者有没有合适的方法来做到这一点?

【问题讨论】:

  • 我喜欢有人问我到底想问什么!

标签: java spring-security


【解决方案1】:

您肯定需要编写自己的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<String, String> m = new HashMap<String, String>;
      m.put("myCustom1", request.getParameter("myCustom1"));
      m.put("myCustom2", request.getParameter("myCustom2"));
      auth.setDetails(m);
}

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

<bean id="requestFormFilter" class="...RequestFormDetails">
   <custom-filter position="LAST" />
</bean> 

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

【讨论】:

    【解决方案2】:

    执行此 IMO 的最佳方法是让您的一项服务(可能是 UserService)实现 UserDetailsS​​ervice 并在 Spring Security XML 中指定您希望使用自己的用户详细信息服务。

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

    这里是此文档的链接:spring security manual, chapter 8 这是一篇关于为密码加密实现自定义用户详细信息服务的博客文章:example usage

    希望对你有帮助

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-16
      • 2011-08-12
      • 1970-01-01
      • 2019-12-26
      • 1970-01-01
      • 2011-08-21
      • 2012-05-17
      • 1970-01-01
      相关资源
      最近更新 更多