Основы Springsecurity
В предыдущей статье «Основное использование Springboot + Spring Security Security и персонализированной конфигурации входа в систему» была кратко введена Springsecurity, в основном представляя интерфейс и реализацию функций. В этой статье пытается сделать простой анализ процесса аутентификации пользователя с точки зрения исходного кода.
Перед конкретным анализом мы можем сначала посмотреть на общие принципы Springsecurity:
Основы Springsecurity
Фактически, это относительно просто, в основном через серию фильтров для перехвата и обработки запроса.
Описание процесса обработки сертификации
Давайте посмотрим на класс UsernamePasswordAuthenticationFilter напрямую.
Открытый класс usernamepasswordAuthenticationFilter Extraves AbstractAuthenticationProcessingFilter // Войдите в систему для запроса аутентификации Public Authentication попытки аутентификации (httpservletrequest, httpservletresponse response) throws authenticationexexception {// определить, является ли это пост -запрос if (this.postonly &&! Бросьте новую аутентификацию serviceException («Метод аутентификации не поддерживается:» + request.getMethod ()); } else {// Получить пользователя, пароль String username = this.obtainusername (запрос); String пароль = this.obtainpassword (запрос); if (username == null) {username = ""; } if (password == null) {password = ""; } username = username.trim (); // генерировать токен, usernamepasswordAuthenticationToken autrequest = new UserNamePassWordAuthenticationToken (имя пользователя, пароль); this.setDetails (запрос, autrequest); // далее подтвердить возврат this.getAuthenticationManager (). Authenticate (Authrequest); }}} В методе attemptAuthentication главным является получение значений имени пользователя и запросов пароля, а затем генерировать объект usernamepassWortAuthenticationToken для дальнейшей проверки.
Но мы можем сначала посмотреть на метод строительства UsernamepassWordAuthenticationToken
public usernamepasswordAuthenticationToken (Principal, учетные данные объекта) {// установить пустое разрешение Super ((Collection) NULL); this.principal = Принципал; this.credentials = полномочия; // установить, является ли это. Setauthenticated (false);} На самом деле, UsernamepassWordAuthenticationToken унаследован от Authentication . Этот объект был упомянут в предыдущей статье. Это параметр в успешном методе вызовов входа в систему, который содержит такие параметры, как информация пользователя, информация о запросе и т. Д.
Итак, посмотрим
this.getAuthenticationManager (). Authenticate (Authrequest);
Здесь есть аутентификация Manager, но настоящий звонок - ProviderManager .
Public Class Providermanager реализует аутентификацию Manager, MessageSourceaware, инициализация Bean {Public Authentication Authentication (аутентификация аутентификации) Проводит аутентификацию Exception {class <? расширяет аутентификацию> totest = Authentication.getClass (); AuthenticationException LastException = null; Результат аутентификации = null; Boolean Debug = logger.isdebugenabled (); Итератор var6 = this.getProviders (). Iterator (); while (var6.hasnext ()) {AuthenticationProvider Provider = (AuthenticationProvider) var6.next (); // 1. Определите, есть ли поставщик для поддержки аутентификации if (Provider.supports (totest)) {// 2. Истинное логическое суждение result = Provider.Authenticate (Authentication); }}} Общественная аутентификация аутентификации (аутентификация аутентификации) выбрасывает AuthenticationException {userDetails user = this.userCache.getUserFromCache (username); if (user == null) {cachewasused = false; // 1. Перейти, чтобы получить пользователь userdetails user = this.retrieveuser (имя пользователя, (usernamepasswordAuthenticationtoken) аутентификация); } try {// 2. Предварительно проверить это. // 3. Дополнительная проверка (проверка пароля) this.additionAlathenthicationChecks (пользователь, (usernamepasswordAuthenticationtoken) аутентификация); } catch (AuthenticationException var7) {} // 4. Последняя проверка this.postauthenticationChecks.check (user); // 5. Вернуть реальную сертифицированную аутентификацию Вернуть это. CreateSuccessAuthentication (PrincipAltorEnturn, Authentication, пользователь);} Две проверки на пользователях здесь в основном через четыре метода, которые возвращают логический тип.
После проверки информации аутентифицированная аутентификация возвращается с помощью метода строительства UsernamePasswordAuthenticationToken .
После получения сертифицированной аутентификации SuccessHandler снова будет вызван. Или, если он не выполняет аутентификацию, позвоните в сбой.
Как результаты аутентификации делятся среди нескольких запросов
После завершения процесса обработки аутентификации пользователя давайте подумаем о том, как поделиться результатом аутентификации между несколькими запросами?
Поскольку для этого нет конфигурации, мы можем подумать о методе по умолчанию, который должен быть для хранения результата аутентификации в сеансе.
Итак, когда он хранится в сессии?
Мы можем продолжать смотреть на исходный код процесса аутентификации. После прохождения метода контроля попыток, если аутентификация будет успешной, будет вызвана успешная проверка. В этом методе называется не только успех, но и есть и строка более важного кода.
SecurityContextholder.getContext (). SetAuthentication (autresult);
SecurityContextholder - это пакет для Threadlocal. Threadlocal - это класс хранения данных внутри потока. Через это данные могут храниться в указанном потоке. После хранения данных только сохраненные данные могут быть получены в указанном потоке, но другие потоки не могут получить данные. Для получения дополнительной информации о принципах Threadlocal, пожалуйста, ознакомьтесь с моей предыдущей статьей.
Вообще говоря, запросы и возвраты того же интерфейса будут завершены в одном потоке. Мы поместили Autresult в SecurityContextholder, и мы также можем вытащить его где -нибудь еще.
Наконец, Autresult извлекается из SecurityContextPersistenceFilter , и сеанс хранится.
SecurityContextPersistenceFilter также является фильтром, который находится в авангарде всей цепочки фильтров безопасности, что означает, что фильтр сначала проходит при запуске проверки, и последний проход, наконец, пройден после завершения проверки.
Получить аутентифицированную информацию пользователя
/*** Получите в настоящее время регистрируемый в настоящее время пользователь* @return Complete Authentication*/ @getMapping ("/me1") public Object CurrentUser () {return securityContexTholder.getContext (). GetAuthentication ();} @getMapping ("/me2") public currentUser (AuthentionAntication) {return Authenturication; userDetails */@getMapping ("/me3") public Object CuuRentUser (@AuthenticationPrincipal userDetails userDetails) {return userDetails;}Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.