如何在Spring Security的SecurityContext中存储自定义信息?

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

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

2个回答

16

我经常使用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();

5

您的“UserDetails”实现可以保存任何其他数据。这些数据将存储在SecurityContext中,在成功登录后可以访问。

您可以通过以下方式访问它(假设MyUserDetails实现了UserDetails)

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

我不确定是否可以在LDAP认证中使用userDetailsSerivce。 - viator
1
您无需实现整个UserDetailsService。您可以仅使用LDAP中自己的UserDetails实现。以下是如何执行此操作的信息 - http://static.springsource.org/spring-security/site/docs/3.1.x/reference/ldap.html#ldap-custom-user-details - Gopi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接