色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Spring Security如何在Servlet中執(zhí)行

瀏覽:110日期:2023-09-07 15:03:10

Spring Security 是一個(gè)強(qiáng)大的認(rèn)證和授權(quán)框架,它的使用方式也非常簡(jiǎn)單,但是要想真正理解它就需要花一時(shí)間來(lái)學(xué)習(xí)了,最近在學(xué)習(xí) Spring Security 時(shí)有一些新的理解,特意記錄下來(lái)防止知識(shí)忘記的太快,畢竟好記性不如爛筆關(guān),也給即將準(zhǔn)備學(xué)習(xí) Spring Security 的同志做一個(gè)參考。

由于我在學(xué)習(xí)和使用是基于 Servlet Applications 的,所以文中的大部分都與 Servlet 相關(guān),當(dāng)然 Spring Security 還支持 Reactive Applications 功能上都是一樣,在架構(gòu)上會(huì)有一些差別,有興趣的同學(xué)可以自行查看官方文檔。

Spring Securty 在 Servlet Applications 中的應(yīng)用

以下部分內(nèi)容摘自官方文檔

Servlet Filter Chain

提到 Servlet Filter Chain 應(yīng)該都熟悉的吧,它們是一系列由 javax.servlet.Filter 實(shí)現(xiàn)類(lèi)組成的一個(gè)鏈,大致圖如下所示:

Spring Security如何在Servlet中執(zhí)行

上圖中Client發(fā)送Http請(qǐng)求,然后請(qǐng)求經(jīng)過(guò)FilterChain,每個(gè)匹配的Filter都有機(jī)會(huì)處理request和response對(duì)象,最終請(qǐng)求會(huì)到達(dá)servlet(如何filter中沒(méi)有特殊處理的情況下)。

Spring Security 的實(shí)現(xiàn)簡(jiǎn)單來(lái)說(shuō),就是往Servlet Filter Chain加了一個(gè)特殊的過(guò)濾器來(lái)處理認(rèn)證或授權(quán)請(qǐng)求 。

DelegatingFilterProxy

Spring 提供一個(gè)javax.servlet.Filter的實(shí)現(xiàn)類(lèi) DelegatingFilterProxy ,它的主要功能跟它的名稱(chēng)一樣,通過(guò)代理模式委托給一個(gè)Spring管理的Bean來(lái)完成相應(yīng)的功能。

Spring Security如何在Servlet中執(zhí)行

在上圖中,DelegatingFilterProxy 會(huì)在 ApplicationContext 中查找 Filter0 并執(zhí)行Filter0的doFilter方法:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { // Lazily get Filter that was registered as a Spring Bean // For the example in DelegatingFilterProxy delegate is an instance of Bean Filter0 Filter delegate = getFilterBean(someBeanName); // delegate work to the Spring Bean delegate.doFilter(request, response);}

FilterChainProxy

前面說(shuō)過(guò)DelegatingFilterProxy只是一個(gè)代理 Filter,并沒(méi)有真正的功能。在 Spring Security 中還有一個(gè) FilterChainProxy 類(lèi),它是 Spring Security 中非常重要的入口(斷點(diǎn)打在這準(zhǔn)沒(méi)錯(cuò)),它負(fù)責(zé)匹配請(qǐng)求、執(zhí)行 Filter 等功能。

Spring Security如何在Servlet中執(zhí)行

你可能發(fā)現(xiàn)了上圖中在FilterChainProxy部分還有個(gè) SecurityFilterChain,它是一個(gè)接口只有兩個(gè)方法:

matches用于匹配請(qǐng)求 getFilters是獲取針對(duì)匹配請(qǐng)求的所有的 Filters

SecurityFilterChain 接口:

public interface SecurityFilterChain { boolean matches(HttpServletRequest request); List<Filter> getFilters();}

SecurityFilterChain

SecurityFilterChain 里面包含很多個(gè) Filter ,不同的 Filter 完成不同的功能,如登陸認(rèn)證、退出登陸、設(shè)置SecurityContext等,在Spring Security 中可以有多個(gè) SecurityFilterChain 每個(gè) SecurityFilterChain 負(fù)責(zé)不同的請(qǐng)求地址,如可以針對(duì)/app/api/**與/web/api/**設(shè)置不同的認(rèn)證規(guī)則。

Spring Security如何在Servlet中執(zhí)行

總結(jié)

前面提到了四個(gè)重要的概念:

Servlet Filter Chain:Serverl過(guò)濾器鏈 DelegatingFilterProxy:Spring Filter代理類(lèi),將功能委托給 FilterChainProxy FilterChainProxy:匹配請(qǐng)求,執(zhí)行 SecurityFilterChain 中的過(guò)濾器 SecurityFilterChain:包含一組Filter

總結(jié)下來(lái)可以用一張圖表示:

Spring Security如何在Servlet中執(zhí)行

根據(jù)上面圖如Client訪問(wèn)/web/api/login就會(huì)匹配到SecurityFilterChain 0并執(zhí)行其中的 Filters。

匹配過(guò)程我看了下FilterChainProxy的源碼,大致流程和我理解的差不多,我把代碼精簡(jiǎn)了一下以下:

public class FilterChainProxy extends GenericFilterBean {private List<SecurityFilterChain> filterChains;@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException { ... doFilterInternal(request, response, chain); ...}private void doFilterInternal(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException { ...List<Filter> filters = getFilters(fwRequest); ...VirtualFilterChain vfc = new VirtualFilterChain(fwRequest, chain, filters);vfc.doFilter(fwRequest, fwResponse);}private List<Filter> getFilters(HttpServletRequest request) {for (SecurityFilterChain chain : filterChains) {if (chain.matches(request)) {return chain.getFilters();}}return null;} private static class VirtualFilterChain implements FilterChain {@Overridepublic void doFilter(ServletRequest request, ServletResponse response)throws IOException, ServletException {...}}

首先在FilterChainProxy的doFilter方法會(huì)執(zhí)行doFilterInternal方法

doFilterInternal 方法中調(diào)用 getFilters 獲取過(guò)濾器列表

private List<Filter> getFilters(HttpServletRequest request) {for (SecurityFilterChain chain : filterChains) {if (chain.matches(request)) {return chain.getFilters();}}return null;}

在 getFilters 會(huì)調(diào)用SecurityFilterChain.matches匹配請(qǐng)求

最后將得到的filters放在 VirtualFilterChain 中執(zhí)行最后

這篇文章主要講述了 Spring Securty 與 Servlet Applications 集成部分

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 特别福利视频在线观看 | 经典三级在线视频 | 国产毛片精品 | 国产性夜夜春夜夜爽30 | 美女很黄很黄免费的 | 欧美一级片免费观看 | 97人摸人人澡人人人超一碰 | 欧美另类69xxxxx极品 | 国产最爽的乱淫视频国语对 | 欧美私人网站 | 26uuu天天夜夜综合 | 91九色精品国产 | 亚洲一级毛片在线观播放 | 国产福利片在线 易阳 | 美女很黄很黄免费的 | 中文字幕在线观看91 | 高清不卡毛片免费观看 | 日本三级中文字幕 | 天天se天天cao综合网蜜芽 | 久久精品视频9 | 亚洲精品播放 | 国产jk福利视频在线观看 | 国产成人亚洲精品 | 美女被免费网站在线软件 | 国产91精品久久久久999 | 久久精品亚洲综合一品 | 欧美成人看片一区二区三区 | 欧美成人777 | 日韩亚洲国产综合久久久 | 色拍拍在精品视频69影院在线 | 欧美α一级毛片 | www.亚洲国产| 色久网| 国产精品分类视频分类一区 | 黑人边吃奶边扎下面激情视频 | 高清亚洲 | 特级一级毛片视频免费观看 | 国产成人v爽在线免播放观看 | 女人张开腿男人猛桶视频 | 成人免费视频社区 | 国产午夜不卡在线观看视频666 |