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 に答える