2012-04-10 2 views
17

Я загрузил роли из базы данных для текущего пользователя. И я могу получить доступ к роли пользователя с выражением Spring Security в jsp и может скрывать параметры и URL-адреса, которые не разрешены с помощью hasRole. Теперь я хотел иметь его в сервлете и отображать его в журналах (или хранить в сеансе пользовательских объектов). Как мы можем добиться этого?Как получить текущие роли пользователя из весенней безопасности 3.1

ответ

53

Вы можете попробовать что-то вроде этого:

Collection<SimpleGrantedAuthority> authorities = (Collection<SimpleGrantedAuthority>) SecurityContextHolder.getContext().getAuthentication().getAuthorities(); 

У вас есть коллекция ролей в переменной власти.

Update: Исправлена ​​опечатка GrantedAuthority родовое

+0

Спасибо, Дани, это сработало для меня. – Bhas

+1

приветствуется;) – Dani

+2

вы должны использовать интерфейс givenauthority в этом списке, так как реализация может отличаться между поставщиками авторизации – Laures

7

Вы пытались позвонить getUserPrincipal() из HttpServletRequest?

+0

Спасибо за ответ, я не пробовал, но я реализовал то, что Дани сказал, это сработало для меня. – Bhas

+7

Достаточно честный. Замечание: подход Дани имеет недостаток в сочетании кода с реализацией безопасности Spring, в то время как getUserPricipal() является стандартным вызовом в спецификации сервлета и должен работать с любым провайдером. – maximdim

+3

С помощью getUserPrincipal() вы получаете только имя запрашивающего. Я думаю, вопрос заключается в том, как получить роли, назначенные этому пользователю, поэтому я думаю, что в getUserPrincipal() тоже не будет работать так. – Jay

2

Чтобы завершить оба ответа ...

Вот реализация по Spring безопасности getUserPrincipal, так что вы можете увидеть, что на самом деле getUserPrincipal нас SecurityContextHolder

public Principal getUserPrincipal() { 
     Authentication auth = getAuthentication(); 

     if ((auth == null) || (auth.getPrincipal() == null)) { 
      return null; 
     }  
     return auth; 
} 

//And the getAuthentication 
private Authentication getAuthentication() { 
    Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 

    if (!trustResolver.isAnonymous(auth)) { 
     return auth; 
    } 
    return null; 
} 
6

Если вы разрабатываете Java 8, становится все легче.

Чтобы получить все роли пользователя:

Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 

Set<String> roles = authentication.getAuthorities().stream() 
    .map(r -> r.getAuthority()).collect(Collectors.toSet()); 

, чтобы проверить, если пользователь имеет определенную роль, например, ROLE_USER:.

Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 

boolean hasUserRole = authentication.getAuthorities().stream() 
      .anyMatch(r -> r.getAuthority().equals("ROLE_USER")); 
0

Защиты springSecurityService

Защита роли = springSecurityService.getAuthentication() getAuthorities()

+2

Пожалуйста, постарайтесь предоставить более обширный и отформатированный ответ. Вы можете проверить [Как написать хороший ответ?] (Https://stackoverflow.com/help/how-to-answer). –

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