0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

「Spring」認(rèn)證安全架構(gòu)指南

「Spring」認(rèn)證安全架構(gòu) ? 來(lái)源:「Spring」認(rèn)證安全架構(gòu) ? 作者:「Spring」認(rèn)證安全 ? 2022-06-27 14:37 ? 次閱讀

本指南是 Spring Security 的入門(mén)指南,提供對(duì)框架設(shè)計(jì)和基本構(gòu)建塊的深入了解。我們僅涵蓋應(yīng)用程序安全的基礎(chǔ)知識(shí)。但是,這樣做,我們可以清除使用 Spring Security 的開(kāi)發(fā)人員遇到的一些困惑。為此,我們通過(guò)使用過(guò)濾器,更一般地,通過(guò)使用方法注解,來(lái)看看在 Web 應(yīng)用程序中應(yīng)用安全性的方式。當(dāng)您需要深入了解安全應(yīng)用程序的工作原理、如何對(duì)其進(jìn)行自定義或需要學(xué)習(xí)如何考慮應(yīng)用程序安全性時(shí),請(qǐng)使用本指南。

本指南并非旨在作為解決最基本問(wèn)題的手冊(cè)或秘訣(這些問(wèn)題還有其他來(lái)源),但它對(duì)初學(xué)者和專(zhuān)家都可能有用。Spring Boot 也經(jīng)常被引用,因?yàn)樗鼮榘踩珣?yīng)用程序提供了一些默認(rèn)行為,并且了解它如何與整體架構(gòu)相適應(yīng)會(huì)很有用。

所有原則同樣適用于不使用 Spring Boot 的應(yīng)用程序。

身份驗(yàn)證和訪問(wèn)控制

應(yīng)用程序安全性歸結(jié)為兩個(gè)或多或少獨(dú)立的問(wèn)題:身份驗(yàn)證(你是誰(shuí)?)和授權(quán)(你可以做什么?)。有時(shí)人們會(huì)說(shuō)“訪問(wèn)控制”而不是“授權(quán)”,這可能會(huì)讓人感到困惑,但這樣想可能會(huì)有所幫助,因?yàn)椤笆跈?quán)”在其他地方被重載了。Spring Security 的架構(gòu)旨在將身份驗(yàn)證與授權(quán)分開(kāi),并為兩者提供策略和擴(kuò)展點(diǎn)。

驗(yàn)證

認(rèn)證的主要策略接口AuthenticationManager,它只有一個(gè)方法:

public interface AuthenticationManager {

  Authentication authenticate(Authentication authentication)
    throws AuthenticationException;
}

An可以在其方法AuthenticationManager中做三件事之一:authenticate()

  • 如果它可以驗(yàn)證輸入代表一個(gè)有效的主體,則返回一個(gè)Authentication(通常帶有)。authenticated=true
  • AuthenticationException如果它認(rèn)為輸入代表無(wú)效的委托人,則拋出一個(gè)。
  • null如果它不能決定返回。

AuthenticationException是運(yùn)行時(shí)異常。它通常由應(yīng)用程序以通用方式處理,具體取決于應(yīng)用程序的樣式或用途。換句話說(shuō),通常不期望用戶代碼來(lái)捕獲和處理它。例如,Web UI 可能會(huì)呈現(xiàn)一個(gè)說(shuō)明身份驗(yàn)證失敗的頁(yè)面,并且后端 HTTP 服務(wù)可能會(huì)發(fā)送一個(gè) 401 響應(yīng),WWW-Authenticate根據(jù)上下文是否有標(biāo)頭。

最常用的實(shí)現(xiàn)AuthenticationManagerProviderManager,它委托給一個(gè)AuthenticationProvider實(shí)例鏈。AnAuthenticationProvider有點(diǎn)像 an AuthenticationManager,但它有一個(gè)額外的方法允許調(diào)用者查詢它是否支持給定的Authentication類(lèi)型:

public interface AuthenticationProvider {

	Authentication authenticate(Authentication authentication)
			throws AuthenticationException;

	boolean supports(Class authentication);
}

方法中的Class參數(shù)supports()是真的Class(只詢問(wèn)它是否支持傳遞給authenticate()方法的東西)。AProviderManager可以通過(guò)委托給AuthenticationProviders. 如果 aProviderManager不能識(shí)別特定的Authentication實(shí)例類(lèi)型,則會(huì)跳過(guò)它。

AProviderManager有一個(gè)可選的父級(jí),如果所有提供者都返回,它可以咨詢它null。如果父級(jí)不可用,則null Authentication結(jié)果為AuthenticationException.

有時(shí),應(yīng)用程序具有受保護(hù)資源的邏輯組(例如,與路徑模式匹配的所有 Web 資源,例如/api/**),并且每個(gè)組都可以有自己的專(zhuān)用AuthenticationManager. 通常,它們中的每一個(gè)都是一個(gè)ProviderManager,并且它們共享一個(gè)父級(jí)。然后,父級(jí)是一種“全局”資源,充當(dāng)所有提供者的后備。

「Spring」認(rèn)證安全架構(gòu)指南

圖 1. 使用的AuthenticationManager層次結(jié)構(gòu)ProviderManager

自定義身份驗(yàn)證管理器

Spring Security 提供了一些配置助手來(lái)快速獲取應(yīng)用程序中設(shè)置的常見(jiàn)身份驗(yàn)證管理器功能。最常用的幫助程序是
AuthenticationManagerBuilder,它非常適合設(shè)置內(nèi)存、JDBC 或 LDAP 用戶詳細(xì)信息或添加自定義UserDetailsService. 以下示例顯示了一個(gè)配置全局(父)的應(yīng)用程序AuthenticationManager

@Configuration
public class ApplicationSecurity extends WebSecurityConfigurerAdapter {

   ... // web stuff here

  @Autowired
  public void initialize(AuthenticationManagerBuilder builder, DataSource dataSource) {
    builder.jdbcAuthentication().dataSource(dataSource).withUser("dave")
      .password("secret").roles("USER");
  }

}

此示例與 Web 應(yīng)用程序相關(guān),但 的使用
AuthenticationManagerBuilder更廣泛(有關(guān)如何實(shí)現(xiàn) Web 應(yīng)用程序安全性的更多詳細(xì)信息,請(qǐng)參閱Web 安全性)。請(qǐng)注意,它
AuthenticationManagerBuilder@Autowired在 a 中的一個(gè)方法中@Bean?——這就是它構(gòu)建全局(父)的原因AuthenticationManager。相反,請(qǐng)考慮以下示例:

@Configuration
public class ApplicationSecurity extends WebSecurityConfigurerAdapter {

  @Autowired
  DataSource dataSource;

   ... // web stuff here

  @Override
  public void configure(AuthenticationManagerBuilder builder) {
    builder.jdbcAuthentication().dataSource(dataSource).withUser("dave")
      .password("secret").roles("USER");
  }

}

如果我們@Override在配置器中使用了 of 方法,那么
AuthenticationManagerBuilder將僅用于構(gòu)建“本地” AuthenticationManager,這將是全局方法的子對(duì)象。在 Spring Boot 應(yīng)用程序中,您可以@Autowired將全局 bean 放入另一個(gè) bean,但您不能對(duì)本地 bean 執(zhí)行此操作,除非您自己顯式公開(kāi)它。

Spring Boot 提供了一個(gè)默認(rèn)的全局AuthenticationManager(只有一個(gè)用戶),除非您通過(guò)提供自己的 bean 類(lèi)型來(lái)?yè)屨妓?span style="color:rgb(0,0,153);">AuthenticationManager。默認(rèn)值本身就足夠安全,您不必?fù)?dān)心太多,除非您主動(dòng)需要自定義全局AuthenticationManager. 如果您進(jìn)行任何構(gòu)建AuthenticationManager.

授權(quán)或訪問(wèn)控制

一旦認(rèn)證成功,我們就可以繼續(xù)進(jìn)行授權(quán),這里的核心策略是AccessDecisionManager. 框架提供了三個(gè)實(shí)現(xiàn),所有三個(gè)都委托給一個(gè)AccessDecisionVoter實(shí)例鏈,有點(diǎn)像ProviderManager委托給AuthenticationProviders.

AnAccessDecisionVoter考慮一個(gè)Authentication(代表一個(gè)主體)和一個(gè)安全的Object,它被裝飾了ConfigAttributes

boolean supports(ConfigAttribute attribute);

boolean supports(Class clazz);

int vote(Authentication authentication, S object,
        Collection attributes);

在和的Object簽名中是完全通用的。它代表用戶可能想要訪問(wèn)的任何內(nèi)容(Web 資源或 Java 類(lèi)中的方法是最常見(jiàn)的兩種情況)。它們也是相當(dāng)通用的,代表安全的裝飾,帶有一些決定訪問(wèn)它所需的權(quán)限級(jí)別的元數(shù)據(jù)。是一個(gè)接口。它只有一個(gè)方法(非常通用并返回 a ),因此這些字符串以某種方式編碼了資源所有者的意圖,表達(dá)了關(guān)于允許誰(shuí)訪問(wèn)它的規(guī)則。典型的是用戶角色的名稱(chēng)(如or ),它們通常具有特殊格式(如
AccessDecisionManagerAccessDecisionVoterConfigAttributesObjectConfigAttributeStringConfigAttributeROLE_ADMINROLE_AUDITROLE_前綴)或表示需要評(píng)估的表達(dá)式。

大多數(shù)人使用默認(rèn)值AccessDecisionManager,即AffirmativeBased(如果任何選民肯定返回,則授予訪問(wèn)權(quán)限)。通過(guò)添加新的或修改現(xiàn)有的工作方式,任何定制都傾向于發(fā)生在選民身上。

使用 Spring 表達(dá)式語(yǔ)言 (SpEL) 表達(dá)式非常常見(jiàn)ConfigAttributes——例如,isFullyAuthenticated() && hasRole('user'). 這由AccessDecisionVoter可以處理表達(dá)式并為它們創(chuàng)建上下文的 an 支持。要擴(kuò)展可以處理的表達(dá)式范圍,SecurityExpressionRoot有時(shí)還需要自定義實(shí)現(xiàn)SecurityExpressionHandler.

網(wǎng)絡(luò)安全

Web 層中的 Spring Security(用于 UI 和 HTTP 后端)是基于 Servlet 的Filters,所以首先看一下Filters一般的作用是有幫助的。下圖顯示了單個(gè) HTTP 請(qǐng)求的處理程序的典型分層。

「Spring」認(rèn)證安全架構(gòu)指南

客戶端向應(yīng)用程序發(fā)送請(qǐng)求,容器根據(jù)請(qǐng)求 URI 的路徑?jīng)Q定應(yīng)用哪些過(guò)濾器和哪個(gè) servlet。最多一個(gè) servlet 可以處理一個(gè)請(qǐng)求,但是過(guò)濾器形成一個(gè)鏈,所以它們是有序的。事實(shí)上,如果過(guò)濾器想要自己處理請(qǐng)求,它可以否決鏈的其余部分。過(guò)濾器還可以修改下游過(guò)濾器和 servlet 中使用的請(qǐng)求或響應(yīng)。過(guò)濾器鏈的順序非常重要,Spring Boot 通過(guò)兩種機(jī)制來(lái)管理它:@Beans類(lèi)型Filter可以有一個(gè)@Order或?qū)崿F(xiàn)Ordered,它們可以是一個(gè)FilterRegistrationBean它本身有一個(gè)訂單作為其 API 的一部分。一些現(xiàn)成的過(guò)濾器定義了自己的常量來(lái)幫助表明他們喜歡的相對(duì)于彼此的順序(例如,SessionRepositoryFilter來(lái)自 Spring Session 有一個(gè)DEFAULT_ORDERof Integer.MIN_VALUE + 50,它告訴我們它喜歡在鏈中處于早期,但是它不排除在它之前出現(xiàn)其他過(guò)濾器)。

Spring Security 在鏈中作為單個(gè)安裝Filter,其具體類(lèi)型是FilterChainProxy,原因我們很快就會(huì)介紹。在 Spring Boot 應(yīng)用程序中,安全過(guò)濾器位于@BeanApplicationContext,默認(rèn)情況下會(huì)安裝它,以便將其應(yīng)用于每個(gè)請(qǐng)求。它安裝在由 定義的位置
SecurityProperties.DEFAULT_FILTER_ORDER,該位置又被錨定
FilterRegistrationBean.REQUEST_WRAPPER_FILTER_MAX_ORDER(Spring Boot 應(yīng)用程序在包裝請(qǐng)求時(shí)期望過(guò)濾器具有的最大順序,修改其行為)。不僅如此:從容器的角度來(lái)看,Spring Security 是一個(gè)單一的過(guò)濾器,但在其中,還有額外的過(guò)濾器,每個(gè)過(guò)濾器都扮演著特殊的角色。下圖顯示了這種關(guān)系:

「Spring」認(rèn)證安全架構(gòu)指南

圖 2. Spring Security 是單一物理的Filter,但將處理委托給內(nèi)部過(guò)濾器鏈

實(shí)際上,安全過(guò)濾器中甚至還有一層間接性:它通常以 . 的形式安裝在容器中DelegatingFilterProxy,而不必一定是 Spring @Bean。代理委托給 a FilterChainProxy,它始終是 a @Bean,通常具有固定名稱(chēng)springSecurityFilterChain。它FilterChainProxy包含在內(nèi)部排列為過(guò)濾器鏈(或鏈)的所有安全邏輯。所有過(guò)濾器都具有相同的 API(它們都實(shí)現(xiàn)了FilterServlet 規(guī)范中的接口),并且它們都有機(jī)會(huì)否決鏈的其余部分。

可以有多個(gè)過(guò)濾器鏈都由 Spring Security 在同一頂層管理,FilterChainProxy并且對(duì)容器都是未知的。Spring Security 過(guò)濾器包含一個(gè)過(guò)濾器鏈列表,并將請(qǐng)求分派到與其匹配的第一個(gè)鏈。下圖顯示了基于匹配請(qǐng)求路徑(/foo/**匹配之前/**)發(fā)生的調(diào)度。這很常見(jiàn),但不是匹配請(qǐng)求的唯一方法。這個(gè)分派過(guò)程最重要的特點(diǎn)是只有一個(gè)鏈處理一個(gè)請(qǐng)求。

「Spring」認(rèn)證安全架構(gòu)指南

圖 3. Spring SecurityFilterChainProxy將請(qǐng)求分派到匹配的第一個(gè)鏈。

沒(méi)有自定義安全配置的普通 Spring Boot 應(yīng)用程序有幾個(gè)(稱(chēng)為 n)過(guò)濾器鏈,其中通常 n=6。第一個(gè) (n-1) 個(gè)鏈只是為了忽略靜態(tài)資源模式,例如/css/**and/images/**和錯(cuò)誤視圖:/error. (路徑可以由用戶使用security.ignored配置SecurityPropertiesbean 控制。)最后一個(gè)鏈匹配包羅萬(wàn)象的路徑 ( /**) 并且更加活躍,包含身份驗(yàn)證、授權(quán)、異常處理、會(huì)話處理、標(biāo)頭寫(xiě)入等邏輯上。默認(rèn)情況下,該鏈中共有 11 個(gè)過(guò)濾器,但通常用戶無(wú)需關(guān)心使用哪些過(guò)濾器以及何時(shí)使用。

容器不知道 Spring Security 內(nèi)部的所有過(guò)濾器這一事實(shí)很重要,尤其是在 Spring Boot 應(yīng)用程序中,默認(rèn)情況下,所有@Beans類(lèi)型Filter都自動(dòng)注冊(cè)到容器中。因此,如果您想將自定義過(guò)濾器添加到安全鏈中,則需要不將其設(shè)為 a@Bean或?qū)⑵浒b在FilterRegistrationBean明確禁用容器注冊(cè)的 a 中。

創(chuàng)建和自定義過(guò)濾器鏈

Spring Boot 應(yīng)用程序(具有請(qǐng)求匹配器的應(yīng)用程序)中的默認(rèn)后備過(guò)濾器鏈/**具有預(yù)定義的
SecurityProperties.BASIC_AUTH_ORDER. 您可以通過(guò)設(shè)置將其完全關(guān)閉security.basic.enabled=false,也可以將其用作后備并以較低的順序定義其他規(guī)則。要執(zhí)行后者,請(qǐng)?zhí)砑右粋€(gè)(或)@Bean類(lèi)型并用 裝飾類(lèi),如下所示:
WebSecurityConfigurerAdapterWebSecurityConfigurer@Order

@Configuration
@Order(SecurityProperties.BASIC_AUTH_ORDER - 10)
public class ApplicationConfigurerAdapter extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.antMatcher("/match1/**")
     ...;
  }
}

這個(gè) bean 導(dǎo)致 Spring Security 添加一個(gè)新的過(guò)濾器鏈并在回退之前對(duì)其進(jìn)行排序。

與另一組相比,許多應(yīng)用程序?qū)σ唤M資源的訪問(wèn)規(guī)則完全不同。例如,托管 UI 和支持 API 的應(yīng)用程序可能支持基于 cookie 的身份驗(yàn)證,通過(guò)重定向到 UI 部分的登錄頁(yè)面和基于令牌的身份驗(yàn)證,以及對(duì) API 部分的未經(jīng)身份驗(yàn)證請(qǐng)求的 401 響應(yīng)。每組資源都有自己
WebSecurityConfigurerAdapter的唯一順序和自己的請(qǐng)求匹配器。如果匹配規(guī)則重疊,則最早排序的過(guò)濾器鏈獲勝。

請(qǐng)求匹配調(diào)度和授權(quán)

安全過(guò)濾器鏈(或等效的 a
WebSecurityConfigurerAdapter)有一個(gè)請(qǐng)求匹配器,用于決定是否將其應(yīng)用于 HTTP 請(qǐng)求。一旦決定應(yīng)用特定的過(guò)濾器鏈,就不會(huì)應(yīng)用其他過(guò)濾器鏈。但是,在過(guò)濾器鏈中,您可以通過(guò)在配置器中設(shè)置額外的匹配器來(lái)對(duì)授權(quán)進(jìn)行更細(xì)粒度的控制HttpSecurity,如下所示:

@Configuration
@Order(SecurityProperties.BASIC_AUTH_ORDER - 10)
public class ApplicationConfigurerAdapter extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.antMatcher("/match1/**")
      .authorizeRequests()
        .antMatchers("/match1/user").hasRole("USER")
        .antMatchers("/match1/spam").hasRole("SPAM")
        .anyRequest().isAuthenticated();
  }
}

配置 Spring Security 時(shí)最容易犯的錯(cuò)誤之一就是忘記這些匹配器適用于不同的進(jìn)程。一種是整個(gè)過(guò)濾器鏈的請(qǐng)求匹配器,另一種只是選擇要應(yīng)用的訪問(wèn)規(guī)則。

將應(yīng)用程序安全規(guī)則與執(zhí)行器規(guī)則相結(jié)合

如果您將 Spring Boot Actuator 用于管理端點(diǎn),您可能希望它們是安全的,并且默認(rèn)情況下它們是安全的。事實(shí)上,只要將執(zhí)行器添加到安全應(yīng)用程序,您就會(huì)獲得一個(gè)僅適用于執(zhí)行器端點(diǎn)的附加過(guò)濾器鏈。它是使用僅匹配執(zhí)行器端點(diǎn)的請(qǐng)求匹配器定義的,它的順序?yàn)?/span>
ManagementServerProperties.BASIC_AUTH_ORDER,比默認(rèn)的SecurityProperties回退過(guò)濾器少 5 個(gè),因此在回退之前對(duì)其進(jìn)行查詢。

如果您希望您的應(yīng)用程序安全規(guī)則應(yīng)用于執(zhí)行器端點(diǎn),您可以添加一個(gè)比執(zhí)行器更早排序的過(guò)濾器鏈,并且該過(guò)濾器鏈具有包含所有執(zhí)行器端點(diǎn)的請(qǐng)求匹配器。如果您更喜歡執(zhí)行器端點(diǎn)的默認(rèn)安全設(shè)置,最簡(jiǎn)單的方法是在執(zhí)行器之后添加您自己的過(guò)濾器,但在回退之前添加(例如,
ManagementServerProperties.BASIC_AUTH_ORDER + 1),如下所示:

@Configuration
@Order(ManagementServerProperties.BASIC_AUTH_ORDER + 1)
public class ApplicationConfigurerAdapter extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.antMatcher("/foo/**")
     ...;
  }
}

Web 層中的 Spring Security 當(dāng)前與 Servlet API 相關(guān)聯(lián),因此它僅在 servlet 容器中運(yùn)行應(yīng)用程序時(shí)才真正適用,無(wú)論是嵌入的還是其他的。但是,它不依賴于 Spring MVC 或 Spring Web 堆棧的其余部分,因此它可以在任何 servlet 應(yīng)用程序中使用——例如,使用 JAX-RS 的應(yīng)用程序。

方法安全

除了支持保護(hù) Web 應(yīng)用程序之外,Spring Security 還支持將訪問(wèn)規(guī)則應(yīng)用于 Java 方法執(zhí)行。對(duì)于 Spring Security,這只是一種不同類(lèi)型的“受保護(hù)資源”。對(duì)于用戶,這意味著使用相同格式的ConfigAttribute字符串(例如,角色或表達(dá)式)聲明訪問(wèn)規(guī)則,但在代碼中的不同位置。第一步是啟用方法安全性——例如,在我們應(yīng)用程序的頂層配置中:

@SpringBootApplication
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SampleSecureApplication {
}

然后我們可以直接裝飾方法資源:

@Service
public class MyService {

  @Secured("ROLE_USER")
  public String secure() {
    return "Hello Security";
  }

}

此示例是具有安全方法的服務(wù)。如果 Spring 創(chuàng)建了@Bean這種類(lèi)型的 a,它會(huì)被代理,調(diào)用者必須在方法實(shí)際執(zhí)行之前通過(guò)安全攔截器。如果訪問(wèn)被拒絕,調(diào)用者會(huì)得到一個(gè)AccessDeniedException而不是實(shí)際的方法結(jié)果。

您可以在方法上使用其他注釋來(lái)強(qiáng)制實(shí)施安全約束,特別是@PreAuthorize@PostAuthorize,它們?cè)试S您編寫(xiě)分別包含對(duì)方法參數(shù)和返回值的引用的表達(dá)式。

將 Web 安全性和方法安全性結(jié)合起來(lái)并不少見(jiàn)。過(guò)濾器鏈提供用戶體驗(yàn)功能,例如身份驗(yàn)證和重定向到登錄頁(yè)面等,方法安全性提供更細(xì)粒度的保護(hù)。

使用線程

Spring Security 基本上是線程綁定的,因?yàn)樗枰巩?dāng)前經(jīng)過(guò)身份驗(yàn)證的主體可用于各種下游消費(fèi)者?;緲?gòu)建塊是SecurityContext,它可能包含一個(gè)Authentication(當(dāng)用戶登錄時(shí),它是一個(gè)Authentication顯式的authenticated)。您始終可以SecurityContext通過(guò)靜態(tài)便捷方法訪問(wèn)和SecurityContextHolder操作ThreadLocal. 以下示例顯示了這種安排:

SecurityContext context = SecurityContextHolder.getContext();
Authentication authentication = context.getAuthentication();
assert(authentication.isAuthenticated);

用戶應(yīng)用程序代碼執(zhí)行此操作并不常見(jiàn),但如果您需要編寫(xiě)自定義身份驗(yàn)證過(guò)濾器(盡管即使這樣,Spring Security 中也有一些基類(lèi)可供您使用,以便您可以避免需要使用SecurityContextHolder)。

如果您需要訪問(wèn) Web 端點(diǎn)中當(dāng)前經(jīng)過(guò)身份驗(yàn)證的用戶,可以在 a 中使用方法參數(shù)@RequestMapping,如下所示:

@RequestMapping("/foo")
public String foo(@AuthenticationPrincipal User user) {
  ... // do stuff with user
}

此注解將電流Authentication拉出SecurityContext并調(diào)用其上的getPrincipal()方法以產(chǎn)生方法參數(shù)。Principalin an的類(lèi)型Authentication取決于AuthenticationManager用于驗(yàn)證身份驗(yàn)證的類(lèi)型,因此這可能是一個(gè)有用的小技巧,可以獲取對(duì)用戶數(shù)據(jù)的類(lèi)型安全引用。

如果使用 Spring Security,則PrincipalfromHttpServletRequest是 type Authentication,所以你也可以直接使用它:

@RequestMapping("/foo")
public String foo(Principal principal) {
  Authentication authentication = (Authentication) principal;
  User = (User) authentication.getPrincipal();
  ... // do stuff with user
}

如果您需要編寫(xiě)在不使用 Spring Security 時(shí)工作的代碼,這有時(shí)會(huì)很有用(您需要在加載Authentication類(lèi)時(shí)更加防御)。

異步處理安全方法

由于SecurityContext是線程綁定的,如果您想要執(zhí)行任何調(diào)用安全方法的后臺(tái)處理(例如, with @Async),您需要確保傳播上下文。這歸結(jié)為使用在后臺(tái)執(zhí)行SecurityContext的任務(wù)(Runnable、等)包裝 。CallableSpring Security 提供了一些幫助程序來(lái)簡(jiǎn)化此操作,例如 和 的包裝RunnableCallable。要傳播SecurityContextto@Async方法,您需要提供AsyncConfigurer并確保其Executor類(lèi)型正確:

@Configuration
public class ApplicationConfiguration extends AsyncConfigurerSupport {

  @Override
  public Executor getAsyncExecutor() {
    return new DelegatingSecurityContextExecutorService(Executors.newFixedThreadPool(5));
  }

}

審核編輯:符乾江

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4700

    瀏覽量

    68115
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    335

    瀏覽量

    14278
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Spring Cloud Gateway網(wǎng)關(guān)框架

    Spring Cloud Gateway網(wǎng)關(guān)框架 本軟件微服務(wù)架構(gòu)中采用Spring Cloud Gateway網(wǎng)關(guān)控制框架,Spring Cloud Gateway是
    的頭像 發(fā)表于 08-22 09:58 ?384次閱讀
    <b class='flag-5'>Spring</b> Cloud Gateway網(wǎng)關(guān)框架

    英飛凌PSOC Edge E8x MCU系列獲PSA最高安全認(rèn)證

    在物聯(lián)網(wǎng)(IoT)應(yīng)用日益廣泛的今天,嵌入式安全已成為保障設(shè)備穩(wěn)定運(yùn)行和數(shù)據(jù)安全的關(guān)鍵。英飛凌科技股份公司近日宣布,其新推出的PSOC? Edge E8x MCU產(chǎn)品系列在設(shè)計(jì)上已滿足嵌入式安全領(lǐng)域的最高標(biāo)準(zhǔn)——平臺(tái)
    的頭像 發(fā)表于 06-07 17:53 ?1632次閱讀

    電熱烤箱CCC認(rèn)證前期資料準(zhǔn)備與認(rèn)證難點(diǎn)指南

    認(rèn)證。電熱烤箱當(dāng)然也不例外。CCC認(rèn)證是中國(guó)國(guó)家強(qiáng)制性產(chǎn)品認(rèn)證的簡(jiǎn)稱(chēng),也稱(chēng)為3C認(rèn)證。這一認(rèn)證對(duì)于產(chǎn)品質(zhì)量和
    的頭像 發(fā)表于 04-28 17:43 ?368次閱讀
    電熱烤箱CCC<b class='flag-5'>認(rèn)證</b>前期資料準(zhǔn)備與<b class='flag-5'>認(rèn)證</b>難點(diǎn)<b class='flag-5'>指南</b>

    Codasip獲得汽車(chē)功能安全和網(wǎng)絡(luò)安全認(rèn)證

    的領(lǐng)導(dǎo)者Codasip今天宣布,它已經(jīng)獲得了功能安全標(biāo)準(zhǔn)ISO 26262和網(wǎng)絡(luò)安全工程標(biāo)準(zhǔn)ISO 21434的認(rèn)證。Codasip的IP硬件工程開(kāi)發(fā)流程、指南和工作說(shuō)明已通過(guò)TüV
    的頭像 發(fā)表于 02-19 09:22 ?454次閱讀

    思特威獲得DEKRA德凱ISO 26262 ASIL B功能安全產(chǎn)品認(rèn)證證書(shū)

    獲得ASIL B功能安全產(chǎn)品認(rèn)證標(biāo)志著思特威車(chē)規(guī)級(jí)CIS產(chǎn)品SC225AT/SC320AT的功能安全架構(gòu)、設(shè)計(jì)實(shí)現(xiàn)及安全覆蓋率均達(dá)到了全球公認(rèn)的汽車(chē)功能安全標(biāo)準(zhǔn)ISO 26262 AS
    的頭像 發(fā)表于 01-18 16:11 ?691次閱讀
    思特威獲得DEKRA德凱ISO 26262 ASIL B功能<b class='flag-5'>安全產(chǎn)品認(rèn)證</b>證書(shū)

    SAFERTOS現(xiàn)已支持RISC-V架構(gòu)安全應(yīng)用

    WHIS是一家為汽車(chē)、醫(yī)療和工業(yè)領(lǐng)域提供實(shí)時(shí)操作系統(tǒng)(RTOS)和平臺(tái)解決方案的安全系統(tǒng)公司。SAFERTOS是WHIS的安全關(guān)鍵預(yù)認(rèn)證RTOS,已通過(guò)TüV SüD獨(dú)立認(rèn)證,符合IE
    的頭像 發(fā)表于 01-12 11:17 ?720次閱讀
    SAFERTOS現(xiàn)已支持RISC-V<b class='flag-5'>架構(gòu)</b><b class='flag-5'>安全</b>應(yīng)用

    針對(duì)大數(shù)據(jù)安全架構(gòu)設(shè)計(jì)的思路和原則

    數(shù)據(jù)分類(lèi)與標(biāo)記:對(duì)于大數(shù)據(jù)系統(tǒng)中的數(shù)據(jù)進(jìn)行分類(lèi)和標(biāo)記,根據(jù)數(shù)據(jù)的敏感程度和重要性確定相應(yīng)的安全級(jí)別。這可以幫助確定如何處理、存儲(chǔ)和傳輸數(shù)據(jù)。
    的頭像 發(fā)表于 12-27 11:18 ?1150次閱讀
    針對(duì)大數(shù)據(jù)<b class='flag-5'>安全架構(gòu)</b>設(shè)計(jì)的思路和原則

    Spring狀態(tài)機(jī)的實(shí)現(xiàn)原理和使用方法

    說(shuō)起 Spring 狀態(tài)機(jī),大家很容易聯(lián)想到這個(gè)狀態(tài)機(jī)和設(shè)計(jì)模式中狀態(tài)模式的區(qū)別是啥呢?沒(méi)錯(cuò),Spring 狀態(tài)機(jī)就是狀態(tài)模式的一種實(shí)現(xiàn),在介紹 Spring 狀態(tài)機(jī)之前,讓我們來(lái)看看設(shè)計(jì)模式中的狀態(tài)模式。
    的頭像 發(fā)表于 12-26 09:39 ?1787次閱讀
    <b class='flag-5'>Spring</b>狀態(tài)機(jī)的實(shí)現(xiàn)原理和使用方法

    第二屆大會(huì)回顧第5期 | 分級(jí)安全架構(gòu)構(gòu)筑智能汽車(chē)功能、網(wǎng)絡(luò)、隱私三安全

    委員會(huì)副首席科學(xué)家、終端BG/車(chē)BU首席安全架構(gòu)師。主要負(fù)責(zé)HarmonyOS/OpenHarmony操作系統(tǒng)安全架構(gòu)設(shè)計(jì)、終端芯片安全架構(gòu)、安全芯片、可信計(jì)算、移動(dòng)應(yīng)用生態(tài)治理
    的頭像 發(fā)表于 12-19 08:36 ?415次閱讀
    第二屆大會(huì)回顧第5期 | 分級(jí)<b class='flag-5'>安全架構(gòu)</b>構(gòu)筑智能汽車(chē)功能、網(wǎng)絡(luò)、隱私三<b class='flag-5'>安全</b>

    GD32VW553認(rèn)證測(cè)試指南應(yīng)用說(shuō)明

    電子發(fā)燒友網(wǎng)站提供《GD32VW553認(rèn)證測(cè)試指南應(yīng)用說(shuō)明.pdf》資料免費(fèi)下載
    發(fā)表于 12-14 10:10 ?0次下載
    GD32VW553<b class='flag-5'>認(rèn)證</b>測(cè)試<b class='flag-5'>指南</b>應(yīng)用說(shuō)明

    PCB的DDR4布線指南和PCB的架構(gòu)改進(jìn)

    PCB的DDR4布線指南和PCB的架構(gòu)改進(jìn)
    的頭像 發(fā)表于 12-07 15:15 ?2311次閱讀

    dubbo和spring cloud區(qū)別

    Dubbo和Spring Cloud是兩個(gè)非常流行的微服務(wù)框架,各有自己的特點(diǎn)和優(yōu)勢(shì)。在本文中,我們將詳細(xì)介紹Dubbo和Spring Cloud的區(qū)別。 1.架構(gòu)設(shè)計(jì): Dubbo是阿里巴巴開(kāi)源
    的頭像 發(fā)表于 12-04 14:47 ?1492次閱讀

    Spring MVC的工作原理

    Spring MVC是一種基于Java的Web應(yīng)用程序框架,它采用了Model-View-Controller(MVC)設(shè)計(jì)模式來(lái)分離應(yīng)用程序的不同方面。Spring MVC的工作原理涉及多個(gè)關(guān)鍵
    的頭像 發(fā)表于 12-03 11:49 ?707次閱讀

    spring分布式框架有哪些

    Spring分布式框架。 Spring Cloud Spring Cloud是基于Spring Boot的分布式開(kāi)發(fā)工具包。它提供了多個(gè)子項(xiàng)目,包括服務(wù)注冊(cè)與發(fā)現(xiàn)、客戶端負(fù)載均衡、斷
    的頭像 發(fā)表于 11-16 10:58 ?716次閱讀

    Spring布能用來(lái)搭建基礎(chǔ)架構(gòu)

    Spring Boot 是一個(gè)用于簡(jiǎn)化 Spring 應(yīng)用程序開(kāi)發(fā)的框架,它利用 Spring 框架的強(qiáng)大功能,使得基礎(chǔ)架構(gòu)的搭建變得更加簡(jiǎn)單、輕量級(jí)、易于維護(hù)。在本文中,我們將詳細(xì)討
    的頭像 發(fā)表于 11-16 10:56 ?350次閱讀