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获取更多资讯