В большинстве ответов отсутствуют некоторые пункты:
Роль и авторитет не одно и то же в Spring.Смотрите здесь для больше деталей.
Имена ролей равны rolePrefix
+ authority
.
Префикс роли по умолчанию - ROLE_
, однако он настраивается.См. здесь .
Следовательно, для правильной проверки роли необходимо соблюдать префикс роли, если он настроен.
К сожалению, настройка префиксов ролей в Spring немного хакерская, во многих местах префикс по умолчанию, ROLE_
, жестко закодирован, но в дополнение к этому в Spring проверяется бин типа GrantedAuthorityDefaults
контекста и, если он существует, его префикс настраиваемой роли соблюдается.
Если собрать всю эту информацию вместе, лучшая реализация средства проверки роли будет выглядеть примерно так:
@Component
public class RoleChecker {
@Autowired(required = false)
private GrantedAuthorityDefaults grantedAuthorityDefaults;
public boolean hasRole(String role) {
String rolePrefix = grantedAuthorityDefaults != null ? grantedAuthorityDefaults.getRolePrefix() : "ROLE_";
return Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication())
.map(Authentication::getAuthorities)
.map(Collection::stream)
.orElse(Stream.empty())
.map(GrantedAuthority::getAuthority)
.map(authority -> rolePrefix + authority)
.anyMatch(role::equals);
}
}