中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

建立健全制度如何推廣seo

建立健全制度,如何推廣seo,黃山風(fēng)景區(qū)門票多少錢,網(wǎng)絡(luò)平臺怎么制作一、前言 此篇是對上篇 Spring Security 6.x 系列(5)—— Servlet 認證體系結(jié)構(gòu)介紹 中4.9章節(jié)顯式調(diào)用SecurityContextRepository#saveContext進行詳解分析。 二、設(shè)置和修改登錄態(tài) 2.1 登錄態(tài)存儲形式 使用Spring Security框架,認證成功…

一、前言

此篇是對上篇 Spring Security 6.x 系列(5)—— Servlet 認證體系結(jié)構(gòu)介紹 中4.9章節(jié)顯式調(diào)用SecurityContextRepository#saveContext進行詳解分析。

二、設(shè)置和修改登錄態(tài)

2.1 登錄態(tài)存儲形式

使用Spring Security框架,認證成功后的用戶信息會放在Authentication對象的Principal中,
Authentication對象又會被放入SecurityContext中,而SecurityContext 存在這2個地方:

  • SecurityContextHolderStrategy :線程級別的SecurityContext持有策略。有全局共享、線程繼承、線程隔離等幾種獲取上下文的方式(上文有過介紹)。

  • SecurityContextRepository:持久化SecurityContext ,默認存入HttpServletRequestHttpSession。

在代碼中,我們要獲取用戶登錄信息,可以通過SecurityContextHolder.getContext().getAuthentication()的方式獲取,這種方式是從SecurityContextHolderStrategy獲取用戶數(shù)據(jù)。而SecurityContextHolderStrategy初始化數(shù)據(jù)又是來自SecurityContextRepository,相關(guān)邏輯是在SecurityContextHolderFilter類里。

SecurityContextHolderFilter#doFilter源碼如下:

在這里插入圖片描述
查看securityContextRepository如下:

在這里插入圖片描述

設(shè)想一種場景,在用戶登錄后,編輯了用戶信息,這時要同步刷新SecurityContext里的用戶信息。我們要如何更新這兩個處的用戶數(shù)據(jù)呢?

2.2 更新SecurityContextHolderStrategy中的用戶信息

要更新SecurityContextHolderStrategy非常簡單,因為它保存在內(nèi)存里,只要通過SecurityContextHolder.getContext().getAuthentication() 獲取認證信息后,直接設(shè)置對應(yīng)的屬性,內(nèi)存中屬性值發(fā)生變化,后續(xù)處理邏輯就能讀到最新值。

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
MyUser myUser = (MyUser) authentication.getPrincipal();
myUser.setNickname("新的昵稱");

2.3 更新SecurityContextRepository中的用戶信息

2.3.1 了解SecurityContextRepository接口

SecurityContextRepository是一個接口,源碼如下:

public interface SecurityContextRepository {/** @deprecated */@DeprecatedSecurityContext loadContext(HttpRequestResponseHolder requestResponseHolder);default DeferredSecurityContext loadDeferredContext(HttpServletRequest request) {Supplier<SecurityContext> supplier = () -> {return this.loadContext(new HttpRequestResponseHolder(request, (HttpServletResponse)null));};return new SupplierDeferredSecurityContext(SingletonSupplier.of(supplier), SecurityContextHolder.getContextHolderStrategy());}void saveContext(SecurityContext context, HttpServletRequest request, HttpServletResponse response);boolean containsContext(HttpServletRequest request);
}

SecurityContextRepository接口有以下幾個實現(xiàn)類:

  • NullSecurityContextRepository:什么都不做,也就是不會存儲,每次請求都需要重新認證
  • HttpSessionSecurityContextRepository:將SecurityContext保存在Session中,獲取的時候,從Session中查詢
  • RequestAttributeSecurityContextRepository:將SecurityContext保存在請求對象HttpServletRequest
  • DelegatingSecurityContextRepository:委派代理存儲,內(nèi)部維護多個SecurityContextRepository,實現(xiàn)同時支持多種方式存儲SecurityContext。

2.3.2 無法直接獲取SecurityContextRepository對象

要知道怎么更新SecurityContextRepository ,我們先看其他地方是怎么調(diào)用它。往SecurityContextRepository寫數(shù)據(jù)是在用戶認證成功之后,調(diào)用AbstractAuthenticationProcessingFilter#successfulAuthentication() 方法,執(zhí)行認證成功的后續(xù)邏輯時。

在這里插入圖片描述
在這里插入圖片描述

這里的this.securityContextRepository是通過setter方法傳進來的,并且發(fā)現(xiàn)Spring Security沒有把SecurityContextRepository注冊到Spring容器,而且Spring Security其他持有SecurityContextRepository對象的類都沒有暴露SecurityContextRepository的獲取方法。也就是說,我們無法從Spring Security拿到默認的SecurityContextRepository對象。

debug發(fā)現(xiàn)this.securityContextRepository屬性指向了 DelegatingSecurityContextRepository,這是委派代理存儲,代理的對象是 RequestAttributeSecurityContextRepositoryHttpSessionSecurityContextRepository,所以在默認的情況下,用戶登錄成功之后,在這里就把登錄用戶數(shù)據(jù)分別存入到HttpSessionSecurityContextRepositoryRequestAttributeSecurityContextRepository中。

在這里插入圖片描述

部分DelegatingSecurityContextRepository源碼如下:

在這里插入圖片描述
在這里插入圖片描述

2.3.3 手動設(shè)置SecurityContextRepository對象

為了順利拿到SecurityContextRepository對象,我們可以手動往Spring容器注冊一個SecurityContextRepository對象,然后把它塞到Spring Security里。通過這種方式,我們能從Spring容器拿到SecurityContextRepository 對象,然后隨時刷新SecurityContext。

具體實現(xiàn)代碼如下:

@Bean
public SecurityContextRepository securityContextRepository() {return new DelegatingSecurityContextRepository(new RequestAttributeSecurityContextRepository(), new HttpSessionSecurityContextRepository());
}@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity, SecurityContextRepository securityContextRepository) throws Exception {httpSecurity.securityContext((context) -> context.securityContextRepository(securityContextRepository()));
}

這里DelegatingSecurityContextRepositorySpring Security中的SecurityContextRepository默認實現(xiàn),我們原封不動保留下來。

2.3.4 更新登錄態(tài)

在更新完SecurityContextHolderStrategy 對象之后,我們顯式把SecurityContext重新保存到SecurityContextRepository。

// 更新SecurityContextHolderStrategy
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
MyUser myUser = (MyUser) authentication.getPrincipal();
myUser.setNickname("新的昵稱");// 更新SecurityContextRepository
securityContextRepository.saveContext(SecurityContextHolder.getContext(), request, response);

三、總結(jié)

通過顯式更新SecurityContextHolderStrategy、SecurityContextRepository ,我們就能完整更新SecurityContext 中的用戶信息。如果項目中引入了Spring SessionSpring Session維護的登錄態(tài)也會同步更新。

http://www.risenshineclean.com/news/30349.html

相關(guān)文章:

  • 網(wǎng)站建設(shè) 售后服務(wù)seo下拉優(yōu)化
  • 鄭州正規(guī)網(wǎng)站設(shè)計價格seo門戶
  • 漳州網(wǎng)站優(yōu)化下載百度導(dǎo)航app
  • 交友網(wǎng)站建設(shè)惠城網(wǎng)站設(shè)計
  • 任縣企業(yè)做網(wǎng)站怎么推廣淘寶店鋪
  • 織夢手機網(wǎng)站源碼下載可口可樂軟文范例
  • 淘寶客優(yōu)惠券網(wǎng)站怎么做的google怎么推廣
  • 怎么在網(wǎng)上做公司網(wǎng)站如何創(chuàng)建自己的網(wǎng)址
  • 建設(shè)兵團12師教育局網(wǎng)站淘寶一個關(guān)鍵詞要刷多久
  • wordpress自己寫代碼百度自然排名優(yōu)化
  • 煙臺龍口網(wǎng)站建設(shè)百度收錄最新方法
  • 天津建設(shè)銀行網(wǎng)站深圳百度推廣代理商
  • 保定建設(shè)信息網(wǎng)站百度外推代發(fā)排名
  • 有一個網(wǎng)站叫浪什么網(wǎng)站優(yōu)化比較好的公司
  • 導(dǎo)購網(wǎng)站怎么做有特色友情鏈接頁面
  • 網(wǎng)站怎么做 吸引人上海做關(guān)鍵詞推廣企業(yè)
  • 如何做網(wǎng)站推廣的方案設(shè)計企業(yè)推廣哪個平臺好
  • web網(wǎng)站開發(fā)的設(shè)計思想公司域名查詢官網(wǎng)
  • 做企業(yè)網(wǎng)站首頁尺寸百度關(guān)鍵詞網(wǎng)站排名優(yōu)化軟件
  • 如何在導(dǎo)航網(wǎng)站上做鏈接優(yōu)化近義詞
  • 做網(wǎng)站外包網(wǎng)頁設(shè)計與制作代碼
  • 長沙建站公司模板百度seo快速排名優(yōu)化軟件
  • 福建省華榮建設(shè)集團有限公司網(wǎng)站長春網(wǎng)絡(luò)推廣優(yōu)化
  • 個人網(wǎng)站logo青島網(wǎng)站制作推廣
  • 免費域名查詢網(wǎng)站推廣app最快的方法
  • 創(chuàng)建一個網(wǎng)頁多少錢sem優(yōu)化托管
  • wordpress ios 默認合肥seo網(wǎng)站排名
  • 專注做蔬菜的網(wǎng)站汕頭seo管理
  • 定制網(wǎng)站費用南寧seo專員
  • 如何設(shè)計酒店網(wǎng)站建設(shè)seo建站優(yōu)化推廣