国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

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

建立健全制度如何推廣seo

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

一、前言

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

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

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

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

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

  • SecurityContextRepository:持久化SecurityContext ,默認(rèn)存入HttpServletRequestHttpSession。

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

SecurityContextHolderFilter#doFilter源碼如下:

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

在這里插入圖片描述

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

2.2 更新SecurityContextHolderStrategy中的用戶信息

要更新SecurityContextHolderStrategy非常簡(jiǎn)單,因?yàn)樗4嬖趦?nèi)存里,只要通過(guò)SecurityContextHolder.getContext().getAuthentication() 獲取認(rèn)證信息后,直接設(shè)置對(duì)應(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是一個(gè)接口,源碼如下:

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接口有以下幾個(gè)實(shí)現(xiàn)類(lèi):

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

2.3.2 無(wú)法直接獲取SecurityContextRepository對(duì)象

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

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

這里的this.securityContextRepository是通過(guò)setter方法傳進(jìn)來(lái)的,并且發(fā)現(xiàn)Spring Security沒(méi)有把SecurityContextRepository注冊(cè)到Spring容器,而且Spring Security其他持有SecurityContextRepository對(duì)象的類(lèi)都沒(méi)有暴露SecurityContextRepository的獲取方法。也就是說(shuō),我們無(wú)法從Spring Security拿到默認(rèn)的SecurityContextRepository對(duì)象。

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

在這里插入圖片描述

部分DelegatingSecurityContextRepository源碼如下:

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

2.3.3 手動(dòng)設(shè)置SecurityContextRepository對(duì)象

為了順利拿到SecurityContextRepository對(duì)象,我們可以手動(dòng)往Spring容器注冊(cè)一個(gè)SecurityContextRepository對(duì)象,然后把它塞到Spring Security里。通過(guò)這種方式,我們能從Spring容器拿到SecurityContextRepository 對(duì)象,然后隨時(shí)刷新SecurityContext。

具體實(shí)現(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默認(rèn)實(shí)現(xiàn),我們?cè)獠粍?dòng)保留下來(lái)。

2.3.4 更新登錄態(tài)

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

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

三、總結(jié)

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

http://aloenet.com.cn/news/30349.html

相關(guān)文章:

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