Spring Безопасность: установите GrantedAuthorities
Есть ли способ установить List<GrantedAuthority>
в объекте Authentication/UserDetailsImpl? В моем приложении у меня есть два уровня безопасности: один для входа в систему (который использует мой пользовательский аутентификатор входа в класс, который я установил для объекта Authentication
, используя UsernamePasswordAuthenticationToken
), и один для "запроса", где пользователь предлагается ответить на конкретный вопрос.
Что я хочу сделать, это добавить GrantedAuthority
в текущий List<GrantedAuthority>
, который был создан во время процесса входа в систему, после того как пользователь ответит на вопрос о вызове.
Возможно ли это?
Ответы
Ответ 1
вы можете сделать это со следующим кодом:
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)
);
Ответ 2
Метод UserDetails.getAuthorities()
возвращает объект Collection<GrantedAuthority>
. Вы можете использовать соответствующий метод Collection
, чтобы добавить новые полномочия в эту коллекцию.
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (principal instanceof UserDetails) {
((UserDetails) principal).getAuthorities().add(New GrantedAuthorityImpl("ROLE_FOO"));
}
Села.