1. Обзор
В этом руководстве мы рассмотрим, как настроить Spring Security для использования разных конфигураций безопасности для разных шаблонов URL.
Это полезно, когда приложение требует большей безопасности для определенных операций, а другие разрешены для всех пользователей.
2. Настройка
Начнем с настройки приложения.
Для создания этой службы нам понадобятся зависимости Web и Security . Начнем с добавления в
pom.xml
файл следующих зависимостей:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
3. Создайте API
Мы создадим веб-службу RESTful с двумя API: API продукта и API клиента. Для этого мы настроим два контроллера.
3.1. API продукта
Давайте создадим ProductController
. Он содержит единственный метод getProducts
, который возвращает список продуктов:
@RestController("/products")
public class ProductController {
@GetMapping
public List<Product> getProducts() {
return new ArrayList<>(Arrays.asList(
new Product("Product 1", "Description 1", 1.0),
new Product("Product 2", "Description 2", 2.0)
));
}
}
3.2. Клиентский API
Точно так же давайте определим CustomerController:
@RestController("/customers")
public class CustomerController {
@GetMapping("/{id}")
public Customer getCustomerById(@PathVariable("id") String id) {
return new Customer("Customer 1", "Address 1", "Phone 1");
}
}
В типичном веб-приложении все пользователи, включая гостевых пользователей, могут получить список продуктов.
Однако получить информацию о клиенте по его идентификатору может только администратор. Итак, мы определим нашу конфигурацию безопасности таким образом, чтобы это было возможно.
4. Настройте конфигурацию безопасности
Когда мы добавим Spring Security в проект, он по умолчанию отключит доступ ко всем API. Поэтому нам нужно настроить Spring Security, чтобы разрешить доступ к API.
Мы можем сделать это, создав класс SecurityConfiguration
, который расширяет класс WebSecurityConfigurerAdapter
.
Создадим класс SecurityConfiguration :
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/products/**").permitAll()
.and()
.authorizeRequests()
.antMatchers("/customers/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.httpBasic();
}
}
Здесь мы переопределили метод configure(HttpSecurity)
для настройки безопасности приложения.
Кроме того, чтобы подготовиться к базовой аутентификации, нам нужно настроить пользователей для нашего приложения .
Мы прочитаем каждую часть кода, чтобы лучше понять его.
4.1. Разрешение запросов к API продуктов
authorizeRequests():
этот метод указывает Spring использовать следующие правила при авторизации запросов.antMatchers("/products/**"):
указывает шаблоны URL, для которых применяется конфигурация безопасности. Мы связываем это с действиемallowAll()
. Если запрос содержит в своем пути «/products»
, ему разрешено перейти к контроллеру.- Мы можем добавить больше правил в нашу конфигурацию, используя метод
and()
.
Это отмечает конец одной цепочки правил. Другие правила, которые следуют, также будут применяться к запросам. Поэтому нам нужно убедиться, что наши правила не противоречат друг другу. Хорошей практикой является определение общих правил вверху и более конкретных правил внизу.
4.2. Разрешить доступ к клиентскому API только администратору
Теперь давайте посмотрим на вторую часть конфигурации:
- Чтобы запустить новое правило, мы снова можем использовать метод
authorizeRequests()
. antMatchers("/customers/**").hasRole("ADMIN"):
если URL-адрес содержит "/customers"
в пути, мы проверяем, что пользователь, делающий запрос, имеет роль ADMIN.
Если пользователь не аутентифицирован, это приведет к ошибке «401 Unauthorized». Если у пользователя неправильная роль, это приведет к ошибке «403 Forbidden».
4.3. Правило по умолчанию
Мы добавили совпадения для соответствия определенным запросам. Теперь нам нужно определить поведение по умолчанию для остальных запросов.
anyRequest().authenticated()
— anyRequest()
определяет цепочку правил для любого запроса, который не соответствует предыдущим правилам . В нашем случае такие запросы будут проходить до тех пор, пока они аутентифицированы.
Обратите внимание, что в конфигурации может быть только одно правило по умолчанию, и оно должно быть в конце . Если мы попытаемся добавить правило после добавления правила по умолчанию, то получим ошибку — «Не удается настроить antMatchers after anyRequest».
5. Тестирование
Давайте протестируем оба API, используя cURL.
5.1. Протестируйте API продукта
$ curl -i http://localhost:8080/products
[
{
"name": "Product 1",
"description": "Description 1",
"price": 1.0
},
{
"name": "Product 2",
"description": "Description 2",
"price": 2.0
}
]
Мы получаем два продукта в ответ, как и ожидалось.
5.2. Протестируйте клиентский API
$ curl -i http://localhost:8080/customers/1
Тело ответа пусто.
Если мы проверим заголовок, мы увидим статус «401 Unauthorized». Это связано с тем, что доступ к Customer API разрешен только пользователям, прошедшим проверку подлинности, с ролью ADMIN.
Теперь попробуем еще раз, добавив в запрос информацию для аутентификации:
$ curl -u admin:password -i http://localhost:8080/customers/1
{
"name": "Customer 1",
"address": "Address 1",
"phone": "Phone 1"
}
Большой! Теперь мы можем получить доступ к Customer API.
6. Заключение
В этом руководстве мы узнали, как настроить Spring Security в приложении Spring Boot. Мы также рассмотрели настройку доступа для шаблона URL с помощью метода antMatchers()
.
Как обычно, код для этого туториала можно найти на GitHub .