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

时间:2010-07-20 06:54:52

标签: authentication spring-security customization

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

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

2 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:4)

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

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

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