2017-11-17 10 views
1

私はショッピングカートのプロパティを持つカスタムUserDetailsの実装を持っています。私は、匿名ユーザーがあまりにもMyUserDetailsのインスタンスになりたいスプリングセキュリティのゲストユーザ

class MyUserDetails implement UserDetails { 
    private Cart cart; 
    // getters & setters + other properties.... 
} 

、これまでのところ、私はそれ以外の作業それを得ているが、すべてanonymousUsersは同じショッピングカートを持っています!

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    MyUserDetails anonymousUser = new MyUserDetails(); 
    anonymousUser.setUsername("anonymousUser"); 
    http.anonymous().principal(anonymousUser); 
    ... 
} 

どのように私は、各セッションの匿名ユーザーためMyUserDetailsの新しいインスタンスを返すことができるのでしょうか?

+1

私はあなたのセッションでショッピングカートを持っていると書いています。あなたの認証はショッピングカートを必要としません。 'UserDetails'はコアユーザ情報のみを含むべきです。 – dur

+0

@durショッピングカートはユーザーに属していると思います。たとえば、登録ユーザーのショッピングカートをログイン間や別のデバイス間に保存したい場合などです。 – Mico

+1

もちろん、それはユーザの一部ですが、それが 'UserDetails'の一部であることを意味するものではありません。ショッピングカートをセッションに入れたり、データベースからロードすることができます。これは 'UserDetails'とは関係ありません。 – dur

答えて

1

私はそれがこのようなカスタムAnonymousAuthenticationFilterを作成することで、作業を取得するために管理し、かなり確信しています:

public class MyAnonymousAuthenticationFilter extends AnonymousAuthenticationFilter { 
    private static final String USER_SESSION_KEY = "user"; 
    private final String key; 

    public MyAnonymousAuthenticationFilter(String key) { 
     super(key); 
     this.key = key; 
    } 

    @Override 
    protected Authentication createAuthentication(HttpServletRequest req) { 
     HttpSession httpSession = req.getSession(); 
     MyUserDetails user = Optional.ofNullable((MyUserDetails) httpSession.getAttribute(USER_SESSION_KEY)) 
       .orElseGet(() -> { 
        MyUserDetails anon = new MyUserDetails(); 
        anon.setUsername("anonymousUser"); 
        httpSession.setAttribute(USER_SESSION_KEY, anon); 
        return anon; 
       }); 
     return new AnonymousAuthenticationToken(key, user, AuthorityUtils.createAuthorityList("ROLE_ANONYMOUS")); 
    } 
} 

し、このアプローチに問題がある場合http.anonymous().authenticationFilter(new MyAnonymousAuthenticationFilter(UUID.randomUUID().toString()));

でそれを使用するか、またはあなたが良い方法を知っているなら、私に教えてください!

+0

ユーザーはいつも匿名になりますか?または特定のURLパターンのために? – jdc91

1

私の最初の発言は、私が@durのコメントに同意する傾向があるということですが、その後、私はそれが春のアーキテクチャによって、さらにインラインになると思いますが、まだあなたのアプローチに固執することを好む場合はそれが

:-)また別の話ですフィルタの代わりに AuthenticationProviderを実装して、匿名トークンを処理(認証)することができます。このように:

public class MyAuthenticationProvider implements AuthenticationProvider { 

    @Override 
    public Authentication authenticate(Authentication authentication) throws AuthenticationException { 

    //enrich the authentication here. 
    } 


    @Override 
    public boolean supports(Class<?> authentication) { 
    return (AnonymousAuthenticationToken.class 
     .isAssignableFrom(authentication)); 
    } 
} 

あなたはその後、例えば、WebSecurityConfigurerAdapterによって初期化されるかもしれないあなたのフィルター・チェーンにこのプロバイダを登録します。これを行うには、ローカル認証マネージャーを設定します。これは、このように何とかなります

@Override 
protected void configure(
    AuthenticationManagerBuilder auth) throws Exception { 
    auth.authenticationProvider(new MyAuthenticationProvider()); 
} 

hereを参照してください。春のセキュリティアーキテクチャの優れた徹底的な見直しについて。

関連する問題