欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring Security SecurityContextHolder組件示例說(shuō)明

 更新時(shí)間:2024年11月20日 10:13:20   作者:瘋一樣的碼農(nóng)  
SpringSecurity的SecurityContextHolder組件是存儲(chǔ)當(dāng)前安全上下文的地方,包括認(rèn)證用戶信息,它支持全局訪問(wèn)、線程局部存儲(chǔ)和上下文傳播,是SpringSecurity認(rèn)證和授權(quán)的核心,文章通過(guò)示例展示了如何訪問(wèn)已認(rèn)證用戶的詳細(xì)信息、手動(dòng)設(shè)置認(rèn)證信息以及使用認(rèn)證信息保護(hù)方法

在本篇博客中,我們將討論 Spring Security 的 SecurityContextHolder 組件,包括其實(shí)現(xiàn)方式、關(guān)鍵特性,并通過(guò)實(shí)際示例進(jìn)行說(shuō)明。

理解 SecurityContextHolder

SecurityContextHolder 是 Spring Security 存儲(chǔ)當(dāng)前安全上下文詳細(xì)信息的地方。這個(gè)上下文包括:

  • 當(dāng)前已認(rèn)證的用戶
  • 用戶的授予權(quán)限
  • 其他相關(guān)安全細(xì)節(jié)

SecurityContextHolder 在 Spring Security 的認(rèn)證和授權(quán)過(guò)程中起著核心作用,使開(kāi)發(fā)者能夠在應(yīng)用程序的任何地方訪問(wèn)用戶的當(dāng)前安全上下文。

SecurityContextHolder 的關(guān)鍵特性

  • 全局訪問(wèn):它允許全局訪問(wèn)當(dāng)前的認(rèn)證詳細(xì)信息。
  • 線程局部存儲(chǔ):默認(rèn)情況下,它將認(rèn)證詳細(xì)信息存儲(chǔ)在線程局部變量中,確保安全上下文隔離到各個(gè)線程。
  • 上下文傳播:它支持安全上下文在不同線程間的傳播,這對(duì)于異步處理至關(guān)重要。

SecurityContextHolder 的工作原理

SecurityContextHolder 使用 SecurityContext 來(lái)持有表示當(dāng)前已認(rèn)證用戶的 Authentication 對(duì)象。Authentication 對(duì)象包含:

  • 主體(Principal)
  • 憑證(Credentials)
  • 授予權(quán)限(Granted Authorities)

當(dāng)用戶認(rèn)證成功后,Spring Security 會(huì)更新 SecurityContextHolder 中的認(rèn)證詳細(xì)信息。在整個(gè)請(qǐng)求生命周期中,應(yīng)用程序可以通過(guò) SecurityContextHolder 訪問(wèn)這些認(rèn)證詳細(xì)信息,以便進(jìn)行安全相關(guān)的決策。

存儲(chǔ)安全上下文的策略

Spring Security 提供了幾種存儲(chǔ)安全上下文的策略:

  • MODE_THREADLOCAL:默認(rèn)策略,將上下文存儲(chǔ)在線程局部變量中。
  • MODE_INHERITABLETHREADLOCAL:支持子線程繼承父線程的安全上下文。
  • MODE_GLOBAL:全局上下文,但由于潛在的安全風(fēng)險(xiǎn),很少使用。

使用示例

示例 1:訪問(wèn)已認(rèn)證用戶的詳細(xì)信息

一個(gè)常見(jiàn)的用例是在控制器或服務(wù)中訪問(wèn)已認(rèn)證用戶的詳細(xì)信息,如用戶名或角色。

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String username = authentication.getName();
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();

這段代碼從 SecurityContextHolder 中獲取當(dāng)前的 Authentication 對(duì)象,從而訪問(wèn)已認(rèn)證用戶的用戶名和權(quán)限。

示例 2:手動(dòng)設(shè)置認(rèn)證信息

在某些情況下,您可能需要手動(dòng)設(shè)置 SecurityContextHolder 中的 Authentication 對(duì)象,例如在測(cè)試或程序化認(rèn)證時(shí)。

Authentication authentication = new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);

這里創(chuàng)建了一個(gè)新的 Authentication 對(duì)象,并將其設(shè)置到 SecurityContextHolder 中,從而在當(dāng)前上下文中認(rèn)證用戶。

示例 3:使用認(rèn)證信息保護(hù)方法

存儲(chǔ)在 SecurityContextHolder 中的認(rèn)證詳細(xì)信息也可以用于保護(hù)方法,例如基于用戶的角色限制方法的執(zhí)行。

public void sensitiveAction() {
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    if (authentication.getAuthorities().contains(new SimpleGrantedAuthority("ROLE_ADMIN"))) {
        // 執(zhí)行敏感操作
    } else {
        throw new AccessDeniedException("此操作僅限管理員執(zhí)行。");
    }
}

此方法檢查當(dāng)前認(rèn)證用戶是否具有 ROLE_ADMIN 權(quán)限,然后決定是否執(zhí)行敏感操作,利用 SecurityContextHolder 進(jìn)行基于角色的訪問(wèn)控制。

結(jié)論

SecurityContextHolder 是 Spring Security 的核心組件之一,提供了管理已認(rèn)證用戶安全上下文的重要機(jī)制。其全局存儲(chǔ)和訪問(wèn)認(rèn)證詳細(xì)信息的能力,使開(kāi)發(fā)者能夠構(gòu)建安全、復(fù)雜的應(yīng)用程序。

通過(guò)理解和有效利用 SecurityContextHolder 及其功能,您可以增強(qiáng)應(yīng)用程序的安全模型,確保敏感操作和數(shù)據(jù)根據(jù)認(rèn)證和授權(quán)原則得到保護(hù)。

到此這篇關(guān)于Spring Security SecurityContextHolder組件的文章就介紹到這了,更多相關(guān)Spring Security SecurityContextHolder組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis攔截器實(shí)現(xiàn)公共字段填充的示例代碼

    Mybatis攔截器實(shí)現(xiàn)公共字段填充的示例代碼

    本文介紹了使用Spring Boot和MyBatis實(shí)現(xiàn)公共字段的自動(dòng)填充功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • Java Springboot 后端使用Mockito庫(kù)進(jìn)行單元測(cè)試流程分析

    Java Springboot 后端使用Mockito庫(kù)進(jìn)行單元測(cè)試流程分析

    使用Mock進(jìn)行單元測(cè)試可以避免啟動(dòng)整個(gè)Spring框架,節(jié)省時(shí)間并降低外部依賴影響,Mock允許模擬外部方法和類,專注于測(cè)試方法的功能邏輯,本文給大家介紹Java Springboot 后端使用Mockito庫(kù)進(jìn)行單元測(cè)試流程分析,感興趣的朋友跟隨小編一起看看吧
    2024-10-10
  • java?random隨機(jī)數(shù)的用法及常見(jiàn)應(yīng)用場(chǎng)景

    java?random隨機(jī)數(shù)的用法及常見(jiàn)應(yīng)用場(chǎng)景

    這篇文章主要給大家介紹了關(guān)于java?random隨機(jī)數(shù)的用法及常見(jiàn)應(yīng)用場(chǎng)景的相關(guān)資料,Java中的Random類是用來(lái)生成偽隨機(jī)數(shù)的工具類,它可以用來(lái)生成隨機(jī)的整數(shù)、浮點(diǎn)數(shù)和布爾值,需要的朋友可以參考下
    2023-11-11
  • SpringMvc之HandlerMapping詳解

    SpringMvc之HandlerMapping詳解

    這篇文章主要介紹了SpringMvc之HandlerMapping詳解,Handler可以理解為具體干活的,也就是我們的業(yè)務(wù)處理邏輯,Handler最終是要通過(guò)url 來(lái)訪問(wèn)到,這樣url 與Handler之間就有一個(gè)映射關(guān)系了,需要的朋友可以參考下
    2023-08-08
  • Maven高級(jí)的聚合和繼承的實(shí)現(xiàn)

    Maven高級(jí)的聚合和繼承的實(shí)現(xiàn)

    在軟件開(kāi)發(fā)中,隨著項(xiàng)目規(guī)模的擴(kuò)大,單個(gè)模塊的開(kāi)發(fā)方式逐漸轉(zhuǎn)變?yōu)槎嗄K開(kāi)發(fā),這種方式帶來(lái)了項(xiàng)目管理上的挑戰(zhàn),其中最常見(jiàn)的問(wèn)題是模塊間的依賴管理和版本控制問(wèn)題,本文就來(lái)介紹一下
    2024-10-10
  • java實(shí)現(xiàn)識(shí)別二維碼圖片功能

    java實(shí)現(xiàn)識(shí)別二維碼圖片功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)識(shí)別二維碼圖片功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Map按單個(gè)或多個(gè)Value排序當(dāng)Value相同時(shí)按Key排序

    Map按單個(gè)或多個(gè)Value排序當(dāng)Value相同時(shí)按Key排序

    Map可以先按照value進(jìn)行排序,然后按照key進(jìn)行排序。 或者先按照key進(jìn)行排序,然后按照value進(jìn)行排序,這樣操作都行,這篇文章主要介紹了Map按單個(gè)或多個(gè)Value排序,當(dāng)Value相同時(shí)按Key排序,需要的朋友可以參考下
    2023-02-02
  • 散列算法與散列碼(實(shí)例講解)

    散列算法與散列碼(實(shí)例講解)

    下面小編就為大家?guī)?lái)一篇散列算法與散列碼(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • ssm項(xiàng)目session使用及其作用域問(wèn)題

    ssm項(xiàng)目session使用及其作用域問(wèn)題

    這篇文章主要介紹了ssm項(xiàng)目session使用及其作用域問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • 提升性能秘密武器Java Unsafe類面試精講

    提升性能秘密武器Java Unsafe類面試精講

    這篇文章主要為大家介紹了提升性能秘密武器Java Unsafe類面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10

最新評(píng)論