Какова последовательность вызовов при обращении к защищенному API в Spring Security? - PullRequest
0 голосов
/ 26 октября 2019

Я новичок в изучении весны. Я не могу найти много ресурсов, которые бы объясняли последовательность событий относительно того, что происходит, когда мы обращаемся к защищенному API весной.

Рассмотрим следующий сценарий:

Я хочу включить пользователявойти в систему, нажав конечную точку / authenticate.

В этом случае я вижу несколько различных классов:

1) WebSecurityConfigAdapter (который позволяет нам указать безопасность и какие роли могут получить доступ к конкретномуконечная точка)

2) Класс OncePerRequestFilter (который перехватывает каждый запрос, проверяет его и устанавливает текущий аутентифицированный принципал в контексте)

3) Класс AuthenticationProvider

4) Абстрактная аутентификациякласс токенов

Когда и где эти классы вызываются в течение жизненного цикла вызова API. Может ли кто-нибудь помочь мне понять или указать мне ресурс, который четко объясняет это с точки зрения последовательности

1 Ответ

0 голосов
/ 27 октября 2019

Spring security - это основанная на фильтрах инфраструктура, которая устанавливает WALL (HttpFireWall) перед вашим приложением с точки зрения прокси-фильтров или Spring-bean-компонентов. Ваш запрос должен пройти через несколько фильтров для достижения вашего API.

Последовательность выполнения в Spring Security

  1. WebAsyncManagerIntegrationFilter Обеспечивает интеграцию междуSecurityContext и Spring Web's WebAsyncManager.

  2. SecurityContextPersistenceFilter Этот фильтр будет выполняться только один раз для каждого запроса, заполняет SecurityContextHolder информацией, полученной из сконфигурированного ранее SecurityContextRepositoryк запросу и сохраняет его обратно в хранилище после завершения запроса и очистки держателя контекста.
    Запрос проверяется для существующего сеанса. Если новый запрос, SecurityContext будет создан в противном случае, если запрос имеет сеанс, тогда существующий контекст безопасности будет получен из репозитория .

  3. HeaderWriterFilter Реализация фильтрачтобы добавить заголовки к текущему ответу.

  4. LogoutFilter Если URL-адрес запроса /logout (для конфигурации по умолчанию) или если URL-адрес запроса настроен RequestMatcherв LogoutConfigurer затем

    • очищает контекст безопасности.
    • делает недействительным сеанс
    • удаляет все файлы cookie с именами cookie, настроенными в LogoutConfigurer
    • Перенаправляет на стандартный URL-адрес успешного выхода из системы / или настроенный URL-адрес успешного выхода из системы или запускает logoutSuccessHandler.
  5. UsernamePasswordAuthenticationFilter

    • Для любого URL-адреса запроса, кроме loginProcessingUrl, этот фильтр не будет обрабатываться дальше, но цепочка фильтров просто продолжается.
    • Если запрашиваемый URL совпадает (должен быть HTTP POST), по умолчанию /login или совпадает .loginProcessingUrl() настроенв FormLoginConfigurern UsernamePasswordAuthenticationFilter пытается выполнить аутентификацию.
    • параметры формы входа по умолчанию: имя пользователя и пароль, могут быть переопределены usernameParameter(String), passwordParameter(String).
    • , настройка .loginPage() переопределяет значения по умолчанию
    • При попытке аутентификации
      • создается объект Authentication (UsernamePasswordAuthenticationToken или любая реализация Authentication в случае вашего пользовательского фильтра аутентификации).
      • и authenticationManager.authenticate(authToken) будут вызваны
      • Обратите внимание, что мы можем настроить любое количество AuthenticationProvider метод authenticate пробует всех провайдеров аутентификации и проверяет любого из провайдеров аутентификации supports authToken / объект аутентификации, поддерживающий поставщика аутентификации, будет использоваться для аутентификации. и возвращает объект аутентификации в случае успешной аутентификации, иначе выдает AuthenticationException.
    • Если будет создан сеанс успешной аутентификации и будет вызван authenticationSuccessHandler, который перенаправляет на настроенный целевой URL-адрес (по умолчаниюis /)
    • Если аутентификация не прошла, пользователь становится неаутентифицированным пользователем и цепочка продолжается.
  6. SecurityContextHolderAwareRequestFilter, если вы используете его для установкиHttpServletRequestWrapper, поддерживающий Spring Security, в ваш контейнер сервлета

  7. 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 и мой собственный реализованный фильтр.
enter image description here

Из документации порядок фильтров указан как

  • ChannelProcessingFilter
  • ConcurrentSessionFilter
  • SecurityContextPersistenceFilter
  • LogoutFilter
  • X509AuthenticationFilter
  • AbstractPreAuthenticatedProcessingFilter
  • CasAuthenticationFilter
  • Имя_пользователяPasswordAuthenticationFilter
  • Аутентификатор
  • * *1208* Конвертер подтверждения*
  • DefaultLoginPageGeneratingFilter
  • DefaultLogoutPageGeneratingFilter
  • ConcurrentSessionFilter
  • DigestAuthenticationFilter
  • BearerTokenAuthenticationFilter 1225 * * * * * * * * * *
  • SecurityContextHolderAwareRequestFilter
  • JaasApiIntegrationFilter
  • RememberMeAuthenticationFilter
  • AnonymousAuthenticationFilter
  • SessionManagementFilter
  • Исключение * TranslationFilter *1240* Фильтр

Вы также можете сослаться на
самый распространенный способ аутентификации современного веб-приложения?
разница между аутентификацией и авторизацией в контексте SpringБезопасность

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...