Spring Security боевые галантерейные товары: знания, связанные с SecurityContext

Spring Boot Java

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