Spring Security уже по умолчанию предоставляет много контроля разрешений.Однако отличный фреймворк должен иметь хорошую расширяемость.Как оказалось, расширяемость Spring Security очень хорошая.Мы можем использовать методы, предоставляемые Spring Security для авторизации, а также авторизацию логика может быть настроена. Словом, играть можно во что угодно!
Сегодня Сонг Гэ познакомит вас с четырьмя распространенными методами контроля разрешений в Spring Security.
- Выражения управляют разрешениями URL-пути
- Разрешения метода управления выражением
- Используйте аннотации фильтра
- Динамические разрешения
Давайте рассмотрим четыре способа по отдельности.
Эта статья является 30-й в серии Spring Security. Чтение предыдущих статей поможет вам лучше понять эту статью:
- Выкопайте большую яму и позвольте Spring Security сделать это!
- Song Ge поможет вам начать работу с Spring Security, не спрашивайте, как снова расшифровать пароль.
- Научите, как настроить вход в форму в Spring Security
- Spring Security разделяет внешний и внутренний интерфейсы, давайте не будем переходить на другую страницу! Все взаимодействия JSON
- Операции авторизации в весенней безопасности оказались настолько простыми
- Как Spring Security хранит пользовательские данные в базе данных?
- Spring Security+Spring Data Jpa объединяют усилия, управление безопасностью становится еще проще!
- Spring Boot + Spring Security реализует функцию автоматического входа в систему
- Spring Boot автоматически входит в систему, как контролировать риски безопасности?
- В проекте микросервиса, где Spring Security лучше, чем Shiro?
- Springsecurity пользовательская логика аутентификации двумя способами (расширенный игровой процесс)
- Как быстро просмотреть IP-адрес пользователя входа в систему пользователя?
- Spring Security автоматически удаляет предыдущего пользователя, вошедшего в систему, одна конфигурация выполнена!
- Spring Boot + Vue разделяет интерфейсные и серверные проекты, как выгнать вошедших в систему пользователей?
- Spring Security поставляется с собственным брандмауэром! Вы даже не представляете, насколько безопасна ваша система!
- Что такое атака с фиксацией сеанса? Как защититься от атак фиксации сеанса в Spring Boot?
- Развертывание кластера, как Spring Security обрабатывает совместное использование сеансов?
- Song Ge учит вас, как защищаться от CSRF-атак в SpringBoot! так легко!
- Учиться учиться досконально! Анализ исходного кода защиты от CSRF в Spring Security
- Две позиции шифрования паролей в Spring Boot!
- Как изучить Spring Security? Почему необходимо учиться систематически?
- Spring Security имеет две стратегии выпуска ресурсов, не используйте их неправильно!
- Song Ge научит вас, как начать работу с единым входом Spring Boot + CAS
- Spring Boot реализует третье решение для единого входа!
- Весенняя загрузка + CAS одиночный вход, как докнуть базу данных?
- Страница входа в Spring Boot + CAS по умолчанию слишком уродлива, что мне делать?
- Используя Swagger для тестирования интерфейса, как перенести токен в заголовок запроса?
- Краткое изложение трех междоменных сценариев в Spring Boot
- Как реализовать 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);
}
}
- Первый метод приветствия, аннотированный ограничением, что только пользователь, который в настоящее время вошел в систему как javaboy, может получить доступ к этому методу.
- Второй метод администратора, указывающий, что пользователь, обращающийся к этому методу, должен иметь роль администратора.
- Третий пользовательский метод, указывающий, что пользователь этого метода должен иметь роль пользователя, но обратите внимание, что роль пользователя необходимо добавить
ROLE_
приставка. - Четвертый метод 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, здесь, конечно, много подробностей, позже с вами по порядку расскажет брат Сонг.
Если друзья чувствуют, что они что-то приобрели, не забудьте щелкнуть и подбодрить Сонге~