如何在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
【讨论】:
我不确定是否可以将 userDetailsSerivce 与 LDAP 身份验证一起使用。 您不需要实现整个 UserDetailsService。您只能将您自己的 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 中创建用户会话?