Рубрики
Без рубрики

Spring Security: Проверьте, есть ли у пользователя роль в Java

Изучите различные способы проверки того, имеет ли аутентифицированный пользователь определенную роль

Автор оригинала: 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 .