Предоставленная власть в сравнении с ролью в Spring Security

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

1. обзор

В этой быстрой статье мы объяснимthe subtle but significant difference between a Role and a GrantedAuthority in Spring Security. Более подробную информацию о ролях и полномочиях см. В статьеhere.

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

Учебное пособие по аутентификации Spring

Как создать производственный процесс регистрации для новых пользователей и поток входа в систему для существующих пользователей.

Read more

Spring Security для REST API

Как защитить REST API с помощью Spring Security - Конфигурация XML, web.xml, коды состояния HTTP для аутентификации и т. Д.

Read more

Spring Security Basic Authentication

Настроить базовую аутентификацию в Spring - Конфигурация XML, Сообщения об ошибках и пример использования защищенных URL-адресов с помощью curl.

Read more

2. GrantedAuthorityс

В Spring Security мы можемthink of each GrantedAuthority as an individual privilege. Примеры могут включатьREAD_AUTHORITY,WRITE_PRIVILEGE или дажеCAN_EXECUTE_AS_ROOT. Важно понимать, чтоthe name is arbitrary.

При прямом использованииGrantedAuthority, например, при использовании выражения типаhasAuthority(‘READ_AUTHORITY'),, мы являемсяrestricting access in a fine-grained manner.

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

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

Точно так же в Spring Security мы можемthink of each Role as a coarse-grained GrantedAuthority that is represented as a String and prefixed with “ROLE. При использованииRole напрямую, например, с помощью выражения типаhasRole(“ADMIN”), мы ограничиваем доступ грубым способом.

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

The core difference between these two is the semantics we attach to how we use the feature. Для фреймворка разница минимальна - и в основном он работает с ними точно так же.

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

Теперь, когда мы увидели, как фреймворк использует концепциюrole, давайте также быстро обсудим альтернативу -using roles as containers of authorities/privileges.

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

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

5. Конфигурация Spring Security

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

Мы можем продемонстрировать подробное требование авторизации, ограничив доступ к/protectedbyrole для пользователей с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 is where the authority mapping takes place. После аутентификации пользователя наш метод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. Запуск и тестирование примера

Мы можем выполнить пример Java-приложенияRolesAuthoritiesApplication, которое находится в папкеGitHub project.

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

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

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

В этом кратком руководстве мы рассмотрели тонкую, но значительную разницу междуRole иGrantedAuthority в Spring Security.