Я понимаю, что защита Spring построена на цепочке фильтров, которая будет перехватывать запрос, обнаруживать (отсутствие) аутентификацию, перенаправлять на точку входа в аутентификацию или передавать запрос в службу авторизации, и в конечном итоге позволить сервлета или исключение безопасности броузера (неавторизованный или неавторизованный). DelegatingFitlerProxy склеивает эти фильтры вместе. Для выполнения своих задач эти службы доступа к фильтрам, такие как UserDetailsService и AuthenticationManager.
Ключевые фильтры в цепочке (в порядке)
- SecurityContextPersistenceFilter (восстанавливает аутентификацию из JSESSIONID)
- UsernamePasswordAuthenticationFilter (выполняет аутентификацию)
- ExceptionTranslationFilter (исключение безопасности catch из фильтра FilterSecurityInterceptor)
- FilterSecurityInterceptor (может вызывать исключения для аутентификации и авторизации)
Я запутался, как эти фильтры используются. Является ли это для Spring предоставленной формы входа, UsernamePasswordAuthenticationFilter используется только для /login, а последние фильтры - нет? Использует ли элемент пространства имен формы-входа автоматическую настройку этих фильтров? Предоставляет ли каждый запрос (заверенный или завершенный) фильтр FilterSecurityInterceptor для URL-адреса, не входящего в систему?
Что делать, если я хочу защитить свой REST API с помощью JWT-токена, который извлекается из входа? Я должен настроить два тега http
для определения пространства имен, прав? Другой для /login с UsernamePasswordAuthenticationFilter
, а другой для URL REST, с пользовательским JwtAuthenticationFilter
.
Создает ли два элемента http
два springSecurityFitlerChains
? По умолчанию отключен UsernamePasswordAuthenticationFilter
, пока я не объявлю form-login
? Как заменить SecurityContextPersistenceFilter
на один, который получит Authentication
из существующего JWT-token
, а не JSESSIONID
?