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

Пожалуйста, не могли бы вы посоветовать?

Заранее спасибо

David L.

ответ

1

Первый Eval Предоставленный орган для зарегистрированного пользователя, как:

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

Теперь, затем initialiaze UsernamePasswordAuthenticationToken, используя код ниже:

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

Наконец, установите эту аутентификацию в контекст безопасности для текущего пользователя, как указано ниже:

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

В моем случае, я работаю с аутентификацией сертификации клиент ... поэтому SecurityContextHolder содержит PreAuthenticatedAuthenticationToken вместо UserPasswordAuthenticationToken ... Является ли проблема связана с этим методом? Потому что, я пробовал ваш метод, прежде чем пытаться очистить контекст, как я делаю в этом примере –

0

Ваш метод работы, мои роли предположение ошибочно на основе главных органов, а не на органы аутентификации. Результат

sc.getAuthentication().getAuthorities() 

не то же самое, как

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

(где sc является securitycontext)

Смежные вопросы