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

Предоставленные полномочия в сравнении с ролью в весенней безопасности

Краткое руководство по различию между предоставленными полномочиями и ролью в Spring Security.

Автор оригинала: baeldung.

1. Обзор

В этой краткой статье мы объясним тонкую, но существенную разницу между Ролью и Предоставленными полномочиями в Spring Security . Для получения более подробной информации о ролях и полномочиях см. статью здесь .

Дальнейшее чтение:

Учебник по проверке подлинности Spring Security

Spring Security Базовая аутентификация

2. Предоставленные Полномочия

В Spring Security мы можем думать о каждом Предоставленном полномочии как об индивидуальной привилегии . Примеры могут включать READ_AUTHORITY , WRITE_PRIVILEGE или даже CAN_EXECUTE_AS_ROOT . Важно понять, что имя произвольно .

При использовании Предоставленных полномочий непосредственно, например, с помощью выражения типа имеет полномочия(‘READ_AUTHORITY’), мы ограничиваем доступ мелкозернистым способом .

Как вы, вероятно, можете догадаться, мы можем обратиться к понятию authority , используя также privilege .

3. Роль авторитета

Аналогично, в Spring Security мы можем думать о каждой Роли как о крупнозернистой Предоставленной власти , которая представлена как Строка и имеет префикс “ РОЛЬ . При использовании Role напрямую, например , через выражение типа hasRole(“ADMIN”) , мы ограничиваем доступ грубым способом.

Стоит отметить, что префикс ” ROLE” по умолчанию настраивается, но объяснение того, как это сделать, выходит за рамки данной статьи.

Основное различие между ними заключается в семантике, которую мы придаем тому, как мы используем эту функцию. Для фреймворка разница минимальна – и он в основном имеет дело с ними точно таким же образом.

4. Роль контейнера

Теперь, когда мы увидели, как фреймворк использует концепцию role , давайте также быстро обсудим альтернативу – использование ролей в качестве контейнеров полномочий | привилегий .

Это более высокоуровневый подход к ролям, который делает их более ориентированной на бизнес концепцией, а не ориентированной на реализацию.

Spring Security framework не дает никаких указаний относительно того, как мы должны использовать эту концепцию, поэтому выбор полностью зависит от реализации.

5. Конфигурация безопасности Пружины

Мы можем продемонстрировать тонкое требование авторизации, ограничив доступ к /protected by authority пользователям с READ_AUTHORITY .

Мы можем продемонстрировать грубое требование авторизации, ограничив доступ к /protected by role пользователям с ROLE_USER .

Давайте настроим такой сценарий в нашей конфигурации безопасности:

@Override
protected void configure(HttpSecurity http) throws Exception {
    // ...
    .antMatchers("/protectedbyrole").hasRole("USER")
    .antMatchers("/protectedbyauthority").hasAuthority("READ_PRIVILEGE")
    // ...
}

6. Простая Инициализация Данных

Теперь, когда мы лучше понимаем основные концепции, давайте поговорим о создании некоторых установочных данных при запуске приложения.

Это, конечно, очень простой способ сделать это, чтобы начать работу с некоторыми предварительными тестовыми пользователями во время разработки – не так, как вы должны обрабатывать данные в производстве.

Мы будем слушать событие обновления контекста:

@Override
@Transactional
public void onApplicationEvent(ContextRefreshedEvent event) {
    MyPrivilege readPrivilege
      = createPrivilegeIfNotFound("READ_PRIVILEGE");
    MyPrivilege writePrivilege
      = createPrivilegeIfNotFound("WRITE_PRIVILEGE"); 
}

Фактическая реализация здесь на самом деле не имеет значения – и, как правило, зависит от используемого вами решения персистентности. Главное – мы настаиваем на авторитетах, которые используем в коде.

7. UserDetailsService

Наша реализация UserDetailsService – это место, где происходит сопоставление полномочий . Как только пользователь прошел аутентификацию, наш метод getAuthorities() заполняет и возвращает объект UserDetails :

private Collection getAuthorities(
  Collection roles) {
    List authorities
      = new ArrayList<>();
    for (Role role: roles) {
        authorities.add(new SimpleGrantedAuthority(role.getName()));
        role.getPrivileges().stream()
         .map(p -> new SimpleGrantedAuthority(p.getName()))
         .forEach(authorities::add);
    }
    
    return authorities;
}

8. Запуск и тестирование примера

Мы можем выполнить пример Roles Authorities Application Java application, найденный в проекте GitHub .

Чтобы увидеть ролевую авторизацию в действии, нам нужно:

  • Доступ http://localhost:8082/protectedbyrole
  • Аутентификация как [email protected] (пароль – “пользователь” )
  • Примечание успешная авторизация
  • Доступ http://localhost:8082/protectedbyauthority
  • Примечание неудачная авторизация

Чтобы увидеть авторизацию на основе полномочий в действии, нам нужно выйти из приложения, а затем:

  • Доступ http://localhost:8082/protectedbyauthority
  • Аутентификация как [email protected] /admin
  • Примечание успешная авторизация
  • Доступ http://localhsot:8082/protectedbyrole
  • Примечание неудачная авторизация

9. Заключение

В этом кратком руководстве мы рассмотрели тонкую, но существенную разницу между Ролью и Предоставленными полномочиями в Spring Security.