2016-09-02 3 views
0

ログアウトせずに現在のログオンユーザーに関連付けられているロールを更新しようとしていますが、うまくいかないようです。ここでSpring Security 4でログインしているユーザーの役割を動的に変更するにはどうすればよいですか?

は私のコードです:

PreAuthenticatedAuthenticationToken authtoken_orig = (PreAuthenticatedAuthenticationToken) SecurityContextHolder 
     .getContext().getAuthentication(); 

Collection<? extends GrantedAuthority> Authorities_orig = authtoken_orig.getAuthorities(); 
ArrayList<SimpleGrantedAuthority> Authorities_new = new ArrayList<SimpleGrantedAuthority>(); 

for (GrantedAuthority sga : Authorities_orig) { 
    SimpleGrantedAuthority tmpsga = (SimpleGrantedAuthority) sga; 
    if (tmpsga.getAuthority().compareTo("ROLE_UNKNOWN") != 0 
      && tmpsga.getAuthority().compareTo("ROLE_SIGNER") != 0) { 
     Authorities_new.add(tmpsga); 
    } 
} 

SimpleGrantedAuthority role_signer_auth = new SimpleGrantedAuthority("ROLE_SIGNER"); 
Authorities_new.add(role_signer_auth); 

PreAuthenticatedAuthenticationToken authtoken_new = new PreAuthenticatedAuthenticationToken(
     authtoken_orig.getPrincipal(), authtoken_orig.getCredentials(), Authorities_new); 
SecurityContextHolder.clearContext(); 
SecurityContextHolder.createEmptyContext().setAuthentication(authtoken_new); 

あなたはアドバイスできますか?事前に

おかげ

デビッドL.のようにログインしているユーザーの権限を付与

答えて

1

初のeval:その後、コードの下に使用してUsernamePasswordAuthenticationToken initialiaze、今

GrantedAuthority grantedAuthority = getNextRoleToAssign(context.getUserDetails()); 

Authentication auth = new UsernamePasswordAuthenticationToken(authorisedUser, passowrd,Collections<GrantedAuthorities>); 

最後に、この認証を後述するように、現在のユーザーのセキュリティコンテキスト:

SecurityContextHolder.getContext().setAuthentication(auth); 
+0

は、私は、クライアント証明書認証と連携...ので、securitycontextholder(scsecuritycontextです) UsernamePasswordAuthenticationTokenの代わりにPreAuthenticatedAuthenticationTokenが含まれています...問題はこのメソッドに関連していますか?なぜなら、私はこのサンプルで行うようにコンテキストをクリアしようとする前にあなたのメソッドを試したからです –

0

あなたの方法を動作しますが、私の役割の仮定が誤って元本当局にしていない認証機関に基づいていました。

sc.getAuthentication().getAuthorities() 

の結果は

((UserDetails)sc.getAuthentication().getPrincipal()).getAuthorities() 

と同じではありません。私の場合は

関連する問題