我的应用程序在身份验证过程中调用Web服务(如下面的代码所示)。
如何在此过程中在HttpSession中保存一些信息? 在用户登录后,诸如customer-account-number之类的信息将在应用程序中的各个其他位置使用。 是否可以将HttpSession参数传递给MyServiceManager的静态登录方法?
public class MyAuthenticationManager implements AuthenticationProvider {
@Override
public boolean supports(Class<? extends Object> authentication) {
return authentication.equals(UsernamePasswordAuthenticationToken.class);
}
@Override
public Authentication authenticate(Authentication authentication) {
//MyServiceManager.login - makes a call to web service
if(MyServiceManager.login(authentication.getName(), authentication.getCredentials().toString(), XXX_HTTP_SESSION_XXX))
{
List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority> ();
authorities.add(new GrantedAuthorityImpl("ROLE_USER"));
authorities.add(new GrantedAuthorityImpl("ROLE_SUPERVISOR"));
return new UsernamePasswordAuthenticationToken(authentication.getName(), authentication.getCredentials(),authorities);
}
else
{
return null;
}
}
}
答案 0 :(得分:3)
在这个问题上打破了很多头后,我能够通过以下解决方法实现目标。 在以下方法中抓住会话实际上是不可行的 public Authentication authenticate(身份验证身份验证)
我创建了一个类
import java.security.Principal;
public class UserInfo implements Principal{
private String customerId;
private String accountNumber;
private String name;
}
我想在会话中存储的信息(如customerId,accountNumber等),我将其保存在userInfo对象中。 并且此对象已传递给UsernamePasswordAuthenticationToken
List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
authorities.add(new GrantedAuthorityImpl("ROLE_USER"));
authorities.add(new GrantedAuthorityImpl("ROLE_SUPERVISOR"));
return new UsernamePasswordAuthenticationToken(**userInfo**, authentication.getCredentials(),authorities);
使用
可在用户会话中随时获取此信息(UserInfo)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
我回家这是一个解决问题的好方法。
答案 1 :(得分:1)
我们可以通过以下方式做到这一点:
ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
HttpSession session= attr.getRequest().getSession(false);
我建议使用false,因为假定没有有效会话的人都不能进入此方法。