2016-04-23 13 views
0

次のシナリオを検討して認証が成功した場合は、現在のユーザーがBeanをスコープのSpring MVCで

@Override 
    public UserDetails loadUserByUsername(String name) throws UsernameNotFoundException { 
     List<GrantedAuthority> authorities = new ArrayList<>(); 
     authorities.add(new SimpleGrantedAuthority("ROLE_USER")); 

     UserProfile profile = users.find(name); 
     if (profile.getUsername().equals("admin")) 
      authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN")); 

     return new User(profile.getUsername(), profile.getPassword(), authorities); 
    } 

が、私はユニークな作りたい、次のように春のセキュリティは、カスタムUserDetailsService実装に対してログインデータを認証session scoped service有効なUserProfileオブジェクト状態によってカスタマイズされた振る舞いを持つコントローラ内で動作します。 UserProfileも管理対象オブジェクトでないとき、私は、それを行うための最善の方法は、それのコンストラクタに設定ファイルに手動でセッションBeanを宣言し、何とかautowireUserProfileまたはセッション・オーナーすることであると思いますが、どのようにそれが可能ですか?この場合

が、私はちょうどログインを投稿するサーバはまた、どのようなサービスの作成を制限するUserProfile

に保存された資格情報を使用して、リモートホストへのSSH接続を維持して認証されたユーザのためのサービスを、作成したいですか?この種の動作を達成する方法はありますか、それとも実際には悪いアーキテクチャですか?

答えて

0

SecurityContextHolderを使用すると、現在の要求の認証済みユーザーにアクセスできます。

public UserDetails getCurrentUser() { 
    Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
    if (principal instanceof UserDetails) { 
     return (UserDetails) principal; 
    } else { 
     //handle not authenticated users 
     return null; 
    } 
} 

今、あなたはあなたのコントローラでサービスをautowireして使用することができます:私は最善のアプローチは、このような方法でシングルトンサービスを作成することだと思います。

+0

実際の 'UserProfile'オブジェクトをセキュリティコンテキストに追加して同じ方法で取得できますか?セッションスコープのBeanを使用しようとすると、次のエラーも発生します。 'org.springframework.web.util.NestedServletException:リクエスト処理に失敗しました。ネストされた例外はjava.lang.IllegalArgumentExceptionです。setAttribute:名前がscopedTarget.sessionBeanの非シリアル化属性 ' –

+0

SecurityContextHolderは、あなたが' UserDetailsS​​ervice'から返したものと同じオブジェクトを返します。だから、 'UserDetails'の代わりに' UserProfile'にキャストできなければなりません。私の例のサービスはシングルトンでなければならず、セッション/リクエストスコープではありません。例外はセッションスコープのBeanを 'Serializable'にする必要があることを意味します。 – Cyril

+0

修正: 'UserDetailsS​​ervice'から' User'を返します。つまり、 'UserProfile'にキャストできません。なぜあなたは 'UserProfile'オブジェクトを必要としますか? – Cyril

関連する問題