Перейти к основному содержимому

Spring Security — настройка различных URL-адресов

· 4 мин. чтения

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 .