1. Введение
добро пожаловать на чтениеПрактичная галантерея Spring Securityсерия статей. В предыдущих двух статьях мы объясниликонфигурация на основеина основе аннотацийдля настройки контроля доступа. Сегодня мы поговорим о том, как получить текущую информацию о пользователе для аутентификации в интерфейсе доступа. Сначала поговорим о конкретном сценарии. Обычно нам нужно получить информацию о текущем аутентифицированном пользователе, когда мы обращаемся к ресурсам, требующим аутентификации после аутентификации. Например, «Запросить мою личную информацию». Если вы явно передаете свойUserIDКонечно неуместно. Поскольку вы получаете доступ к ресурсам после аутентификации, система знает, кто вы. И небезопасно явно раскрывать пользовательский интерфейс поиска. Поэтому нам нужен инструмент в бизнесе, который может получить текущего аутентифицированного пользователя. Далее давайте посмотрим, как Spring Security решает эту проблему.
2. Контекст безопасности SecurityContext
Я не знаю, заметили ли выSpring Security борется с галантерейными товарами: используйте JWT-аутентификацию для доступа к интерфейсукак добитьсяJWTПерехватчик аутентификацииJwtAuthenticationFilter. Когда пара серверовJWT TokenПосле прохождения аутентификации информация о аутентифицированном пользователе будет инкапсулирована вUsernamePasswordAuthenticationTokenв и используйте служебный класс, чтобы поместить в контекст безопасностиSecurityContext, когда сервер отвечает пользователю и использует тот же класс инструментов дляUsernamePasswordAuthenticationTokenотSecurityContextсерединаclearТерять.
Давайте просто поймемSecurityContextЧто это такое?
package org.springframework.security.core.context;
import java.io.Serializable;
import org.springframework.security.core.Authentication;
public interface SecurityContext extends Serializable {
Authentication getAuthentication();
void setAuthentication(Authentication var1);
}
С точки зрения исходного кода это очень простое хранилище.Authenticationконтейнер. иAuthenticationЭто интерфейс учетных данных пользователя, используемый в качестве учетных данных для аутентификации пользователя.Обычно используемые реализации включаютАвторизованный пользователь UsernamePasswordAuthenticationTokenиАнонимный пользовательAnonymousAuthenticationToken. вUsernamePasswordAuthenticationTokenсодержитUserDetails , AnonymousAuthenticationTokenсодержит только одну строкуanonymousUserКак личность анонимного пользователя. мы проходимSecurityContextПри получении контекста требуется суждение о типе. Далее поговорим об операцииSecurityContextкласс инструмента.
3. SecurityContextHolder
Этот класс инструментовSecurityContextHolder. Он предоставляет два полезных метода:
-
clearContextчистый ток
SecurityContext -
getContextполучить текущий
SecurityContext -
setContextустановить текущий
SecurityContext
Обычно мы управляем контекстом безопасности с помощью этих трех методов.SecurityContext. Вы можете использовать служебные классы непосредственно в своем коде.SecurityContextHolderПолучить информацию о пользователе следующим образом:
public String getCurrentUser() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication instanceof AnonymousAuthenticationToken){
return "anonymousUser";
}
UserDetails principal = (UserDetails) authentication.getPrincipal();
return principal.getUsername();
}
3.1 Расширенные знания: стратегия хранения SecurityContextHolder
Вот так же расширяем знания, кратко рассказываем оSecurityContextHolderкак хранитьSecurityContextиз.SecurityContextHolderПо умолчанию существует три типа хранилищаSecurityContextстратегия:
-
MODE_THREADLOCALиспользовать
ThreadLocalмеханизм для сохранения каждого пользователяSecurityContext,политика по умолчанию, обычно мы используем это в строке. -
MODE_INHERITABLETHREADLOCALиспользовать
InheritableThreadLocalмеханизм для сохранения каждого пользователяSecurityContext, который в основном используется в многопоточной среде. - MODE_GLOBALСтатический механизм, действующий глобально. Используется реже.
4. Резюме
SecurityContextдаSpring SecurityОчень важный класс вSecurityContextЧто это такое и что он делает, а также обзор некоторых знаний, которые были сказаны ранее.
также о том, как использоватьSecurityContextHolderдействоватьSecurityContextобъяснил. Наконец, это простоSecurityContextHolderтри храненияSecurityContextстратегии и сценарии использования. надеюсь научиться у васSpring Securityполезный. Пожалуйста, обратите также больше внимания.
关注公众号:Felordcn获取更多资讯
Личный блог: https://felord.cn