如何在spring-security的SecurityContext中存储自定义信息?

Posted

技术标签:

【中文标题】如何在spring-security的SecurityContext中存储自定义信息?【英文标题】:How to store custom information in SecurityContext of spring-security? 【发布时间】:2011-03-18 06:58:30 【问题描述】:

在我的应用程序中,我使用的是 LDAP 身份验证。但我也有 2 个远程服务,需要通过方法登录(用户名、密码)进行身份验证。该方法返回安全令牌,这使我能够调用另一个方法,即我应该将安全令牌作为第一个参数传递给服务方法。 所以我想在使用 LDAP 成功登录后立即获取这些安全令牌并将它们存储在 SecurityContext 中。我尝试使用 form-login 元素的 authentication-success-handler-ref。使用处理程序,我将 SecurityContext 中的 Authentication 对象替换为自定义的 AuthenticationToken,该 AuthenticationToken 不仅包含密码,还包含安全令牌。但在这种情况下,我有一个例外,即没有身份验证提供程序支持此类令牌。 我知道也可以在 HTTP 会话中存储令牌,但在这种情况下,我必须将会话传递给服务对象,所以我想将令牌存储在 SecurityContext 中。

处理服务安全令牌的最佳方法是什么?

【问题讨论】:

【参考方案1】:

我经常使用Authentication.getDetails() 对象来存储可能不直接链接到用户的附加信息。因此,您可以在该字段中存储您想要的任何对象(例如 HashMap),并且它共享 Authentication 对象生命周期。

HashMap<String, Object> info = new HashMap<String, Object>();
info.put("extraInfo", "info");
auth.setDetails(info);
...
Map<String, Object> i = (Map<String, Object>)SecurityContextHolder.getContext().getAuthentication.getDetails();

【讨论】:

【参考方案2】:

您的“UserDetails”实现可能包含任何其他数据。这是存储在 SecurityContext 中的内容,稍后在成功登录后可以访问。

您可以稍后访问它(假设 MyUserDetails 实现了 UserDetails)

Object principal = SecurityContextHolder.getContext().getAuthentication();
if (principal instanceof MyUserDetails) 
  MyUserDetails mud = (MyUserDetails) principal;
  mud.getMyData(); //Extract your additional data here

【讨论】:

我不确定是否可以将 userDetailsS​​erivce 与 LDAP 身份验证一起使用。 您不需要实现整个 UserDetailsS​​ervice。您只能将您自己的 UserDetails 实现与 LDAP 一起使用。以下是有关如何执行此操作的信息 - static.springsource.org/spring-security/site/docs/3.1.x/…

以上是关于如何在spring-security的SecurityContext中存储自定义信息?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security应用开发(20)基于方法的授权使用@RolesAllowed注解

如何在 spring-security 5.2 中增加 RemoteJWKSet 缓存 TTL

您如何在 spring-security 中注销所有已登录的用户?

Facebook 登录后 (javascript sdk) - 如何在 Spring-Security 中创建用户会话?

如何在spring-security中切换角色

spring-security 如何使用用户名或邮箱登录