1. Введение
В Spring Security иногда необходимо проверить, есть ли у аутентифицированного пользователя определенная роль. Это может быть полезно для включения или отключения определенных функций в наших приложениях .
В этом руководстве мы увидим различные способы проверки ролей пользователей в Java для Spring Security.
2. Проверка роли пользователя в Java
Spring Security предоставляет несколько способов проверки ролей пользователей в коде Java . Мы рассмотрим каждый из них ниже.
2.1. @PreAuthorize
Первый способ проверить наличие ролей пользователей в Java — использовать аннотацию @PreAuthorize
, предоставленную Spring Security. Эту аннотацию можно применить к классу или методу, и она принимает одно строковое значение, представляющее выражение SpEL .
Прежде чем мы сможем использовать эту аннотацию, мы должны сначала включить глобальную безопасность метода. Это можно сделать в коде Java, добавив аннотацию @EnableGlobalMethodSecurity
к любому классу конфигурации.
Затем Spring Security предоставляет два выражения , которые мы можем использовать с аннотацией @PreAuthorize
для проверки ролей пользователей:
@PreAuthorize("hasRole('ROLE_ADMIN')")
@GetMapping("/user/{id}")
public String getUser(@PathVariable("id") String id) {
...
}
Мы также можем проверить несколько ролей в одном выражении:
@PreAuthorize("hasAnyRole('ROLE_ADMIN','ROLE_MANAGER')")
@GetMapping("/users")
public String getUsers() {
...
}
В этом случае запрос будет разрешен, если у пользователя есть какая- либо
из указанных ролей.
Если метод вызывается без соответствующей роли, Spring Security выдает исключение и перенаправляет на страницу с ошибкой .
2.2. SecurityContext
Следующий способ, которым мы можем проверить роли пользователей в коде Java, — это класс SecurityContext .
По умолчанию Spring Security использует локальную копию этого класса. Это означает , что каждый запрос в нашем приложении имеет свой контекст безопасности, который содержит сведения о пользователе, делающем запрос .
Чтобы использовать его, мы просто вызываем статические методы в SecurityContextHolder
:
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null && auth.getAuthorities().stream().anyMatch(a -> a.getAuthority().equals("ADMIN"))) {
...
}
Обратите внимание, что мы используем здесь простое имя органа вместо полного имени роли.
Это хорошо работает, когда нам нужны более мелкие проверки — например, определенная часть одного метода. Однако этот подход не сработает, если мы будем использовать режим держателя глобального контекста в Spring Security .
2.3. UserDetailsService
Третий способ поиска ролей пользователей в коде Java — использование UserDetailsService
. Этот bean-компонент мы можем внедрить в любое место нашего приложения и вызывать его по мере необходимости:
@GetMapping("/users")
public String getUsers() {
UserDetails details = userDetailsService.loadUserByUsername("mike");
if (details != null && details.getAuthorities().stream()
.anyMatch(a -> a.getAuthority().equals("ADMIN"))) {
// ...
}
}
Опять же, мы должны использовать здесь имя органа, а не полное имя роли с префиксом.
Преимущество такого подхода в том, что мы можем проверять роли любого пользователя , а не только того, кто сделал запрос.
2.4. Запрос сервлета
Если мы используем Spring MVC , мы также можем проверить роли пользователей в Java с помощью класса HttpServletRequest
:
@GetMapping("/users")
public String getUsers(HttpServletRequest request) {
if (request.isUserInRole("ROLE_ADMIN")) {
...
}
}
3. Заключение
В этой статье мы рассмотрели несколько различных способов проверки ролей с помощью кода Java с помощью Spring Security.
Как всегда, примеры кода из этой статьи можно найти на GitHub .