次のシナリオを検討して認証が成功した場合は、現在のユーザーが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接続を維持して認証されたユーザのためのサービスを、作成したいですか?この種の動作を達成する方法はありますか、それとも実際には悪いアーキテクチャですか?
実際の 'UserProfile'オブジェクトをセキュリティコンテキストに追加して同じ方法で取得できますか?セッションスコープのBeanを使用しようとすると、次のエラーも発生します。 'org.springframework.web.util.NestedServletException:リクエスト処理に失敗しました。ネストされた例外はjava.lang.IllegalArgumentExceptionです。setAttribute:名前がscopedTarget.sessionBeanの非シリアル化属性 ' –
SecurityContextHolderは、あなたが' UserDetailsService'から返したものと同じオブジェクトを返します。だから、 'UserDetails'の代わりに' UserProfile'にキャストできなければなりません。私の例のサービスはシングルトンでなければならず、セッション/リクエストスコープではありません。例外はセッションスコープのBeanを 'Serializable'にする必要があることを意味します。 – Cyril
修正: 'UserDetailsService'から' User'を返します。つまり、 'UserProfile'にキャストできません。なぜあなたは 'UserProfile'オブジェクトを必要としますか? – Cyril