Четыре метода управления разрешениями в Spring Security

Spring Boot
Четыре метода управления разрешениями в Spring Security

Spring Security уже по умолчанию предоставляет много контроля разрешений.Однако отличный фреймворк должен иметь хорошую расширяемость.Как оказалось, расширяемость Spring Security очень хорошая.Мы можем использовать методы, предоставляемые Spring Security для авторизации, а также авторизацию логика может быть настроена. Словом, играть можно во что угодно!

Сегодня Сонг Гэ познакомит вас с четырьмя распространенными методами контроля разрешений в Spring Security.

  • Выражения управляют разрешениями URL-пути
  • Разрешения метода управления выражением
  • Используйте аннотации фильтра
  • Динамические разрешения

Давайте рассмотрим четыре способа по отдельности.

Эта статья является 30-й в серии Spring Security. Чтение предыдущих статей поможет вам лучше понять эту статью:

  1. Выкопайте большую яму и позвольте Spring Security сделать это!
  2. Song Ge поможет вам начать работу с Spring Security, не спрашивайте, как снова расшифровать пароль.
  3. Научите, как настроить вход в форму в Spring Security
  4. Spring Security разделяет внешний и внутренний интерфейсы, давайте не будем переходить на другую страницу! Все взаимодействия JSON
  5. Операции авторизации в весенней безопасности оказались настолько простыми
  6. Как Spring Security хранит пользовательские данные в базе данных?
  7. Spring Security+Spring Data Jpa объединяют усилия, управление безопасностью становится еще проще!
  8. Spring Boot + Spring Security реализует функцию автоматического входа в систему
  9. Spring Boot автоматически входит в систему, как контролировать риски безопасности?
  10. В проекте микросервиса, где Spring Security лучше, чем Shiro?
  11. Springsecurity пользовательская логика аутентификации двумя способами (расширенный игровой процесс)
  12. Как быстро просмотреть IP-адрес пользователя входа в систему пользователя?
  13. Spring Security автоматически удаляет предыдущего пользователя, вошедшего в систему, одна конфигурация выполнена!
  14. Spring Boot + Vue разделяет интерфейсные и серверные проекты, как выгнать вошедших в систему пользователей?
  15. Spring Security поставляется с собственным брандмауэром! Вы даже не представляете, насколько безопасна ваша система!
  16. Что такое атака с фиксацией сеанса? Как защититься от атак фиксации сеанса в Spring Boot?
  17. Развертывание кластера, как Spring Security обрабатывает совместное использование сеансов?
  18. Song Ge учит вас, как защищаться от CSRF-атак в SpringBoot! так легко!
  19. Учиться учиться досконально! Анализ исходного кода защиты от CSRF в Spring Security
  20. Две позиции шифрования паролей в Spring Boot!
  21. Как изучить Spring Security? Почему необходимо учиться систематически?
  22. Spring Security имеет две стратегии выпуска ресурсов, не используйте их неправильно!
  23. Song Ge научит вас, как начать работу с единым входом Spring Boot + CAS
  24. Spring Boot реализует третье решение для единого входа!
  25. Весенняя загрузка + CAS одиночный вход, как докнуть базу данных?
  26. Страница входа в Spring Boot + CAS по умолчанию слишком уродлива, что мне делать?
  27. Используя Swagger для тестирования интерфейса, как перенести токен в заголовок запроса?
  28. Краткое изложение трех междоменных сценариев в Spring Boot
  29. Как реализовать HTTP-аутентификацию в Spring Boot?

1. Выражения управляют разрешениями URL-пути

Прежде всего, давайте посмотрим на первый, который заключается в управлении разрешениями пути URL-адреса с помощью выражений.Этот способ Сун Гэ фактически рассказал вам в предыдущей статье, давайте немного рассмотрим его здесь.

SPRING Security поддерживает использование выражений SPEL в методе управления URL и доступа, если значение возврата является True Expression указывает, что соответствующие разрешения требуются или которые не нуждаются в соответствующих привилегиях. Класс предоставляется выражение SecurityExpressionroot:

Можно видеть, что SecurityExpressionRoot имеет два класса реализации, которые представляют собой расширения SpEL при работе с контролем разрешений URL-адресов и контролем разрешений метода ответа.Например, при выполнении контроля разрешений на основе путей URL-адресов добавляется параметр hasIpAddress.

Давайте взглянем на самый простой SpEL, определенный в классе SecurityExpressionRoot:

Как видите, это выражения, соответствующие этому классу.Позвольте мне немного объяснить эти выражения:

выражение Примечание
hasRole Пользователи с ролью могут получить доступ к ресурсам
hasAnyRole Пользователи могут получить доступ к ресурсам с любой из нескольких ролей
hasAuthority Похоже на: hasRole
hasAnyAuthority Похоже на: hasAnyRole
permitAll Все разрешить доступ
denyAll Всем запрещен доступ
isAnonymous Определить, является ли анонимный пользователь
isAuthenticated Определить, прошла ли аутентификация успешно
isRememberMe Определите, вошли ли вы в систему, запомнив меня
isFullyAuthenticated Определить, вошли ли имя пользователя/пароль
principle Текущий пользователь
authentication Объект пользователя извлечен из SecurityContext

Это самое основное, в его классе наследования есть некоторые расширения, повторяться не буду.

Если разрешения контролируются через URL-адрес, нам нужно настроить только следующим образом:

protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .antMatchers("/admin/**").hasRole("admin")
            .antMatchers("/user/**").hasAnyRole("admin", "user")
            .anyRequest().authenticated()
            .and()
            ...
}

посетите здесь/admin/**Путь в формате требует роли администратора для доступа/user/**Для пути в формате требуется роль администратора или пользователя.

2. Разрешения метода управления выражением

Конечно, мы также можем контролировать разрешения, добавляя аннотации к методам.

Чтобы добавить разрешения управления аннотациями к методу, нам нужно сначала включить использование аннотаций и добавить следующее в класс конфигурации Spring Security:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true,securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    ...
    ...
}

Эта конфигурация включает три аннотации, а именно:

  • @PreAuthorize: проверка разрешений перед выполнением метода
  • @PostAuthorize: проверка разрешений после выполнения метода
  • @Secured: аналогично @PreAuthorize

После того, как эти три объединены со SpEL, использование становится очень гибким.Здесь я поделюсь с вами несколькими демонстрационными примерами.

@Service
public class HelloService {
    @PreAuthorize("principal.username.equals('javaboy')")
    public String hello() {
        return "hello";
    }

    @PreAuthorize("hasRole('admin')")
    public String admin() {
        return "admin";
    }

    @Secured({"ROLE_user"})
    public String user() {
        return "user";
    }

    @PreAuthorize("#age>98")
    public String getAge(Integer age) {
        return String.valueOf(age);
    }
}
  1. Первый метод приветствия, аннотированный ограничением, что только пользователь, который в настоящее время вошел в систему как javaboy, может получить доступ к этому методу.
  2. Второй метод администратора, указывающий, что пользователь, обращающийся к этому методу, должен иметь роль администратора.
  3. Третий пользовательский метод, указывающий, что пользователь этого метода должен иметь роль пользователя, но обратите внимание, что роль пользователя необходимо добавитьROLE_приставка.
  4. Четвертый метод Getage указывает, что возрастной параметр для доступа к этому методу должен быть больше 98, в противном случае запрос не пройдет.

Как видите, выражения здесь по-прежнему очень богаты.Если вы хотите обратиться к параметрам метода, добавьте#То есть вы можете ссылаться как на параметры примитивного типа, так и на параметры объекта.

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

3. Используйте аннотации фильтров

В Spring Security также есть две функции фильтрации @PreFilter и @PostFilter, которые могут автоматически удалять элементы в коллекции на основе заданных условий.

@PostFilter("filterObject.lastIndexOf('2')!=-1")
public List<String> getAllUser() {
    List<String> users = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        users.add("javaboy:" + i);
    }
    return users;
}
@PreFilter(filterTarget = "ages",value = "filterObject%2==0")
public void getAllAge(List<Integer> ages,List<String> users) {
    System.out.println("ages = " + ages);
    System.out.println("users = " + users);
}
  • В методе getAllUser коллекция фильтруется, и возвращаются только элементы с суффиксом 2, а filterObject представляет объект элемента, подлежащий фильтрации.
  • В методе getAllAge, поскольку есть две коллекции, используйте filterTarget, чтобы указать объект фильтра.

4. Динамические разрешения

Динамические разрешения в основном реализуются путем перезаписи перехватчиков и решающих устройств.Я подробно представил это в документе vhr.Вы можете получить документы, ответив на 888 в фоновом режиме публичной учетной записи [Jiangnan A Little Rain], и я не буду повторяться. их.

5. Резюме

Что ж, сегодня я немного расскажу о проблеме авторизации в Spring Security, здесь, конечно, много подробностей, позже с вами по порядку расскажет брат Сонг.

Если друзья чувствуют, что они что-то приобрели, не забудьте щелкнуть и подбодрить Сонге~