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

Села.