2013-02-05 21 views
10

Authentication/UserDetailsImplオブジェクトにList<GrantedAuthority>を設定する必要はありますか?私のアプリケーションでは、セキュリティの2つのレイヤーを持っています.1つはログイン用です(私のカスタムログインオーセンティケーターを使用し、を使用してAuthenticationオブジェクトを設定したクラスで)。もう1つは、特定の質問。Springセキュリティ:GrantedAuthoritiesの設定

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

これは可能ですか?

+0

ことの一つは、UserDetailsの実装が何であるかのクラスです。 SpringにはUserDetailsImplというクラスはありません。 JdbcDaoImplはUserクラスのインスタンスを作成し、LDAPバージョンはLdapUserDetailsImplのインスタンスを作成します。したがって、実際にどのタイプのオブジェクトに依存するかは、権限を変更できるかどうかに大きく依存しています。当然のことながら、Spring提供のUserDetails実装の1つを、権限を与えられた権限セットの不変なセットのようなもののために使用したことはありません。 –

答えて

8

次のコードでそれを行うことができます。これに明確にする

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) 
); 
0

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

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

セルラー。

+1

コレクションに追加できません - > UnmodifiableCollection – Slavak

+0

@Slavakこれは本当にあなたがUserDetailsに使用している実装に依存します。実装では、org.springframework.security.core.userdetailsのUserクラスは使用しません。明らかに、権限を設定または変更する必要がある場合は、コレクションが不変で、setAuthorities()メソッド(UserDetailsインターフェイスでは約束されていない)を実装していない実装を使用すると、質問に対する答えが「いいえ」であることを意味します。いいえ、それは不可能です。それ以外の場合は、UserDetailsの独自の実装を提供する必要があります.AppDetailsは、最も柔軟なアプリケーションが必要とするものです。 –

関連する問題