Автор оригинала: Michael Pratt.
1. введение
В Spring Security иногда необходимо проверить, имеет ли аутентифицированный пользователь определенную роль. Это может быть полезно для включения или отключения определенных функций в наших приложениях .
В этом уроке мы рассмотрим различные способы проверки ролей пользователей в Java на предмет безопасности Spring.
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 . Это боб, который мы можем ввести в любое место нашего приложения и вызвать его по мере необходимости:
@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 .