Spring security - это основанная на фильтрах инфраструктура, которая устанавливает WALL (HttpFireWall) перед вашим приложением с точки зрения прокси-фильтров или Spring-bean-компонентов. Ваш запрос должен пройти через несколько фильтров для достижения вашего API.
Последовательность выполнения в Spring Security
WebAsyncManagerIntegrationFilter
Обеспечивает интеграцию междуSecurityContext и Spring Web's WebAsyncManager.
SecurityContextPersistenceFilter
Этот фильтр будет выполняться только один раз для каждого запроса, заполняет SecurityContextHolder информацией, полученной из сконфигурированного ранее SecurityContextRepositoryк запросу и сохраняет его обратно в хранилище после завершения запроса и очистки держателя контекста.
Запрос проверяется для существующего сеанса. Если новый запрос, SecurityContext будет создан в противном случае, если запрос имеет сеанс, тогда существующий контекст безопасности будет получен из репозитория .
HeaderWriterFilter
Реализация фильтрачтобы добавить заголовки к текущему ответу.
LogoutFilter
Если URL-адрес запроса /logout
(для конфигурации по умолчанию) или если URL-адрес запроса настроен RequestMatcher
в LogoutConfigurer
затем
- очищает контекст безопасности.
- делает недействительным сеанс
- удаляет все файлы cookie с именами cookie, настроенными в
LogoutConfigurer
- Перенаправляет на стандартный URL-адрес успешного выхода из системы
/
или настроенный URL-адрес успешного выхода из системы или запускает logoutSuccessHandler.
UsernamePasswordAuthenticationFilter
- Для любого URL-адреса запроса, кроме loginProcessingUrl, этот фильтр не будет обрабатываться дальше, но цепочка фильтров просто продолжается.
- Если запрашиваемый URL совпадает (должен быть
HTTP POST
), по умолчанию /login
или совпадает .loginProcessingUrl()
настроенв FormLoginConfigurer
n UsernamePasswordAuthenticationFilter
пытается выполнить аутентификацию. - параметры формы входа по умолчанию: имя пользователя и пароль, могут быть переопределены
usernameParameter(String)
, passwordParameter(String)
. - , настройка
.loginPage()
переопределяет значения по умолчанию - При попытке аутентификации
- создается объект
Authentication
(UsernamePasswordAuthenticationToken
или любая реализация Authentication
в случае вашего пользовательского фильтра аутентификации). - и
authenticationManager.authenticate(authToken)
будут вызваны
- Обратите внимание, что мы можем настроить любое количество
AuthenticationProvider
метод authenticate пробует всех провайдеров аутентификации и проверяет любого из провайдеров аутентификации supports
authToken / объект аутентификации, поддерживающий поставщика аутентификации, будет использоваться для аутентификации. и возвращает объект аутентификации в случае успешной аутентификации, иначе выдает AuthenticationException
.
- Если будет создан сеанс успешной аутентификации и будет вызван
authenticationSuccessHandler
, который перенаправляет на настроенный целевой URL-адрес (по умолчаниюis /
) - Если аутентификация не прошла, пользователь становится неаутентифицированным пользователем и цепочка продолжается.
SecurityContextHolderAwareRequestFilter
, если вы используете его для установкиHttpServletRequestWrapper, поддерживающий Spring Security, в ваш контейнер сервлета
AnonymousAuthenticationFilter
Обнаруживает, что в SecurityContextHolder нет объекта Аутентификация, если не найден объект аутентификации, создает объект Authentication
(AnonymousAuthenticationToken
) с предоставленными полномочиями ROLE_ANONYMOUS
. Здесь AnonymousAuthenticationToken
облегчает идентификацию неаутентифицированных пользователей последующих запросов.
Журналы отладки DEBUG - /app/admin/app-config at position 9 of 12 in additional filter chain; firing Filter: 'AnonymousAuthenticationFilter'
DEBUG - Populated SecurityContextHolder with anonymous token: 'org.springframework.security.authentication.AnonymousAuthenticationToken@aeef7b36: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@b364: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: null; Granted Authorities: ROLE_ANONYMOUS'
ExceptionTranslationFilter
, чтобы перехватить любые исключения Spring Security, чтобы можно было либо вернуть ответ об ошибке HTTP, либо запустить соответствующий AuthenticationEntryPoint
FilterSecurityInterceptor
Будет FilterSecurityInterceptor
, который будет последним в цепочке фильтров, который получит объект аутентификации из SecurityContext
и получит список предоставленных прав доступа (роли предоставлены), и он примет решение, разрешить ли этот запрос достичь запрошенного ресурса или нетрешение принимается путем сопоставления с разрешенным AntMatchers
, настроенным в HttpSecurityConfiguration
.
Рассмотрим исключения 401-UnAuthorized и 403-Forbidden. Эти решения будут приняты последними в цепочке фильтров
- Не прошедший проверку подлинности пользователь, пытающийся получить доступ к общему ресурсу - Разрешено
- Unаутентифицированный пользователь, пытающийся получить доступ к защищенному ресурсу - 401-UnAuthorized
- аутентифицированный пользователь, пытающийся получить доступ к ограниченному ресурсу (ограниченный для его роли) - 403-Forbidden
Примечание. Пользовательский запрос передается не только в вышеупомянутых фильтрах, но есть и другие фильтры, которые здесь не показаны. (ConcurrentSessionFilter
, RequestCacheAwareFilter
, SessionManagementFilter
.. .)
Будет иначе, если вы будете использовать пользовательский фильтр аутентификации вместо UsernamePasswordAuthenticationFilter
.
Будет иначе, если вы настроите фильтр аутентификации JWT и пропустите .formLogin() i.e, UsernamePasswordAuthenticationFilter
, это станет совсем другим случаем.
Просто для справки. Фильтры в Spring-Web и Spring-Security. Примечание: ссылается на имя пакета на рис. , так как есть некоторые другие фильтры из orm и мой собственный реализованный фильтр.
Из документации порядок фильтров указан как
- ChannelProcessingFilter
- ConcurrentSessionFilter
- SecurityContextPersistenceFilter
- LogoutFilter
- X509AuthenticationFilter
- AbstractPreAuthenticatedProcessingFilter
- CasAuthenticationFilter
- Имя_пользователяPasswordAuthenticationFilter
- Аутентификатор
- * *1208* Конвертер подтверждения*
- DefaultLoginPageGeneratingFilter
- DefaultLogoutPageGeneratingFilter
- ConcurrentSessionFilter
- DigestAuthenticationFilter
- BearerTokenAuthenticationFilter 1225 * * * * * * * * * *
- SecurityContextHolderAwareRequestFilter
- JaasApiIntegrationFilter
- RememberMeAuthenticationFilter
- AnonymousAuthenticationFilter
- SessionManagementFilter
- Исключение * TranslationFilter *1240* Фильтр
Вы также можете сослаться на
самый распространенный способ аутентификации современного веб-приложения?
разница между аутентификацией и авторизацией в контексте SpringБезопасность