5

我的应用程序在身份验证过程中调用 Web 服务(如下面的代码所示)。

在此过程中如何在 HttpSession 中保存一些信息?用户登录后,诸如客户帐号之类的信息将在应用程序的其他各个地方使用。是否可以将 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;
        }

    }
 }
4

2 回答 2

4

在对这个问题做了很多思考之后,我能够通过以下工作来实现目标。在以下方法 public Authentication authenticate(Authentication authentication) 中获取会话确实不可行

我创建了一个类

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();

我家这是解决问题的好方法。

于 2012-07-18T06:06:50.697 回答
3

我们可以通过以下方式做到这一点:

ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
HttpSession session= attr.getRequest().getSession(false);

我建议使用 false,因为假定没有有效会话的任何人都不应该在此方法中。

于 2019-02-09T10:55:59.350 回答