Рубрики
Без рубрики

Базовая и дайджест – аутентификация для службы REST с Spring Security

Как настроить и настроить как базовую, так и дайджест-аутентификацию для одной и той же службы REST с помощью Spring Security.

Автор оригинала: Eugen Paraschiv.

содержание

  • 1. Обзор
  • 2. Настройка базовой аутентификации
  • 2.1. Удовлетворение ограничения без состояния – избавление от сеансов
  • 3. Настройка дайджест-аутентификации
  • 4. Поддержка обоих протоколов аутентификации в одном и том же сервисе RESTful
  • 4.1. Анонимный запрос
  • 4.2. Запрос с аутентификационными учетными данными
  • 5. Тестирование обоих сценариев
  • 6. Заключение

1. Обзор

В этой статье рассматривается, как настроить как базовую, так и дайджест-аутентификацию на одной и той же структуре URI REST API . В предыдущей статье мы обсуждали другой метод защиты службы REST – аутентификация на основе форм , поэтому базовая и дайджест-аутентификация является естественной альтернативой , а также более RESTful.

2. Настройка базовой аутентификации

Основная причина, по которой аутентификация на основе форм не идеальна для службы RESTful, заключается в том, что Spring Security будет использовать сеансы -это, конечно, состояние на сервере, поэтому ограничения безгражданства в REST практически игнорируются.

Начнем с настройки базовой аутентификации – сначала удаляем старую пользовательскую точку входа и фильтр из основного элемента безопасности :


   

   

Обратите внимание, что поддержка базовой аутентификации была добавлена с помощью одной строки конфигурации – /> – которая обрабатывает создание и подключение как BasicAuthenticationFilter , так и BasicAuthenticationEntryPoint ./>

2.1. Удовлетворение ограничения без состояния – Избавление от сеансов

Одним из основных ограничений архитектурного стиля RESTful является то , что связь клиент-сервер полностью не имеет состояния , как говорится в оригинальной диссертации :

5.1.3 Апатриды

Затем мы добавим ограничение к взаимодействию клиент-сервер: коммуникация должна быть апатридной по своей природе, как в стиле клиент-апатридный сервер (CSS) раздела 3.4.3 (рис. 5-3), так что каждый запрос от клиента к серверу должен содержать всю информацию, необходимую для понимания запроса, и не может использовать преимущества любого сохраненного контекста на сервере. Таким образом, состояние сеанса полностью сохраняется на клиенте .

Концепция Session на сервере имеет долгую историю в Spring Security, и полностью удалить ее до сих пор было трудно, особенно когда конфигурация выполнялась с использованием пространства имен.

Однако Spring Security дополняет конфигурацию пространства имен параметром new stateless для создания сеанса, который фактически гарантирует, что Spring не будет создавать или использовать сеанс. Эта новая опция полностью удаляет все фильтры, связанные с сеансом, из цепочки фильтров безопасности, гарантируя, что аутентификация выполняется для каждого запроса.

3. Настройка дайджест-аутентификации

Начиная с предыдущей конфигурации, фильтр и точка входа, необходимые для настройки дайджест-аутентификации, будут определены как бобы. Затем точка входа digest переопределит точку входа, созданную за кулисами. Наконец, пользовательский digest filter будет введен в цепочку фильтров безопасности с использованием семантики after пространства имен безопасности, чтобы расположить его непосредственно после базового фильтра аутентификации.


   

   
   



   
   



   
   



   
      
         
         
      
   

К сожалению, в пространстве имен security нет поддержки для автоматической настройки дайджест-аутентификации так, как можно настроить базовую аутентификацию с помощью . Из-за этого необходимые бобы должны были быть определены и подключены вручную в конфигурацию безопасности.

4. Поддержка обоих протоколов аутентификации в одном и том же сервисе Restful

Только базовая или дайджест-аутентификация может быть легко реализована в Spring Security; она поддерживает их обоих для одного и того же веб-сервиса RESTful, на одних и тех же сопоставлениях URI, что вводит новый уровень сложности в конфигурацию и тестирование сервиса.

4.1. Анонимный запрос

При использовании как базовых, так и дайджест – фильтров в цепочке безопасности способ обработки анонимного запроса – запроса, не содержащего учетных данных аутентификации ( Authorization HTTP header) – Spring Security заключается в том, что два фильтра аутентификации найдут no credentials и продолжат выполнение цепочки фильтров. Затем, видя, что запрос не был аутентифицирован , создается исключение AccessDeniedException и ловится в фильтре ExceptionTranslationFilter , который запускает точку входа дайджеста, запрашивая у клиента учетные данные.

Обязанности как базового, так и дайджест – фильтров очень узки-они будут продолжать выполнять цепочку фильтров безопасности, если не смогут определить тип учетных данных аутентификации в запросе. Именно из-за этого Spring Security может иметь гибкость настройки с поддержкой нескольких протоколов аутентификации на одном URI.

Когда делается запрос, содержащий правильные учетные данные аутентификации – либо базовые, либо дайджест – этот протокол будет правильно использоваться. Однако при анонимном запросе клиенту будет предложено ввести только учетные данные дайджест-аутентификации. Это связано с тем, что точка входа дайджеста настроена как основная и единственная точка входа в цепочку безопасности Spring; как таковая дайджест-аутентификация может рассматриваться по умолчанию .

4.2. Запрос С Аутентификационными Учетными Данными

Запрос с учетными данными для базовой аутентификации будет идентифицирован заголовком Authorization , начинающимся с префикса “Basic” . При обработке такого запроса учетные данные будут декодированы в базовом фильтре аутентификации, и запрос будет авторизован. Аналогично, запрос с учетными данными для дайджест-аутентификации будет использовать префикс “Digest” для своего заголовка Authorization .

5. Тестирование Обоих Сценариев

Тесты будут потреблять службу REST, создавая новый ресурс после аутентификации с помощью basic или digest:

@Test
public void givenAuthenticatedByBasicAuth_whenAResourceIsCreated_then201IsReceived(){
   // Given
   // When
   Response response = given()
    .auth().preemptive().basic( ADMIN_USERNAME, ADMIN_PASSWORD )
    .contentType( HttpConstants.MIME_JSON ).body( new Foo( randomAlphabetic( 6 ) ) )
    .post( paths.getFooURL() );

   // Then
   assertThat( response.getStatusCode(), is( 201 ) );
}
@Test
public void givenAuthenticatedByDigestAuth_whenAResourceIsCreated_then201IsReceived(){
   // Given
   // When
   Response response = given()
    .auth().digest( ADMIN_USERNAME, ADMIN_PASSWORD )
    .contentType( HttpConstants.MIME_JSON ).body( new Foo( randomAlphabetic( 6 ) ) )
    .post( paths.getFooURL() );

   // Then
   assertThat( response.getStatusCode(), is( 201 ) );
}

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

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

В этой статье рассматривалась конфигурация и реализация как базовой, так и дайджест-аутентификации для службы RESTful с использованием в основном поддержки пространства имен Spring Security, а также некоторых новых функций фреймворка.