31

List<GrantedAuthority>Authentication / UserDetailsImplオブジェクトにを設定する方法はありますか?私のアプリケーションには、2つのセキュリティレイヤーがあります。1つはログイン用(カスタムログインオーセンティケーターを使用し、クラスでは、Authenticationを使用してオブジェクトを設定しますUsernamePasswordAuthenticationToken)、もう1つはユーザーが特定の回答を求められる「チャレンジ質問」用です。質問。

私がやりたいのは、ユーザーがチャレンジの質問に答えた後、ログインプロセス中に作成されGrantedAuthorityた現在のにを追加することです。List<GrantedAuthority>

これは可能ですか?

4

2 に答える 2

34

次のコードでそれを行うことができます:

Collection<SimpleGrantedAuthority> oldAuthorities = (Collection<SimpleGrantedAuthority>)SecurityContextHolder.getContext().getAuthentication().getAuthorities();
SimpleGrantedAuthority authority = new SimpleGrantedAuthority("ROLE_ANOTHER");
List<SimpleGrantedAuthority> updatedAuthorities = new ArrayList<SimpleGrantedAuthority>();
updatedAuthorities.add(authority);
updatedAuthorities.addAll(oldAuthorities);

SecurityContextHolder.getContext().setAuthentication(
        new UsernamePasswordAuthenticationToken(
                SecurityContextHolder.getContext().getAuthentication().getPrincipal(),
                SecurityContextHolder.getContext().getAuthentication().getCredentials(),
                updatedAuthorities)
);
于 2016-07-04T08:31:08.907 に答える
-4

このメソッドはオブジェクトUserDetails.getAuthorities()を返すだけです。Collection<GrantedAuthority>適切なCollection方法を使用して、そのコレクションに新しい権限を追加できます。

Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (principal instanceof UserDetails) {
    ((UserDetails) principal).getAuthorities().add(New GrantedAuthorityImpl("ROLE_FOO"));
}

セラー。

于 2013-05-13T18:38:01.800 に答える