电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

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

Spring Security 是一個(gè)強(qiáng)大的認(rèn)證和授權(quán)框架,它的使用方式也非常簡(jiǎn)單,但是要想真正理解它就需要花一時(shí)間來學(xué)習(xí)了,最近在學(xué)習(xí) Spring Security 時(shí)有一些新的理解,特意記錄下來防止知識(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)類組成的一個(gè)鏈,大致圖如下所示:

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

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

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

DelegatingFilterProxy

Spring 提供一個(gè)javax.servlet.Filter的實(shí)現(xiàn)類 DelegatingFilterProxy ,它的主要功能跟它的名稱一樣,通過代理模式委托給一個(gè)Spring管理的Bean來完成相應(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

前面說過DelegatingFilterProxy只是一個(gè)代理 Filter,并沒有真正的功能。在 Spring Security 中還有一個(gè) FilterChainProxy 類,它是 Spring Security 中非常重要的入口(斷點(diǎn)打在這準(zhǔn)沒錯(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過濾器鏈 DelegatingFilterProxy:Spring Filter代理類,將功能委托給 FilterChainProxy FilterChainProxy:匹配請(qǐng)求,執(zhí)行 SecurityFilterChain 中的過濾器 SecurityFilterChain:包含一組Filter

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

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

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

匹配過程我看了下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 獲取過濾器列表

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)文章:
主站蜘蛛池模板: 不锈钢复合板厂家_钛钢复合板批发_铜铝复合板供应-威海泓方金属复合材料股份有限公司 | 拉伸膜,PE缠绕膜,打包带,封箱胶带,包装膜厂家-东莞宏展包装 | 济南侦探调查-济南调查取证-山东私家侦探-山东白豹调查咨询公司 密集架|电动密集架|移动密集架|黑龙江档案密集架-大量现货厂家销售 | 智能垃圾箱|垃圾房|垃圾分类亭|垃圾分类箱专业生产厂家定做-宿迁市传宇环保设备有限公司 | 单柱拉力机-橡胶冲片机-哑铃裁刀-江都轩宇试验机械厂 | 槽钢冲孔机,槽钢三面冲,带钢冲孔机-山东兴田阳光智能装备股份有限公司 | ICP备案查询_APP备案查询_小程序备案查询 - 备案巴巴 | 洛阳网站建设_洛阳网站优化_网站建设平台_洛阳香河网络科技有限公司 | 工业CT-无锡璟能智能仪器有限公司| 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | 东莞猎头公司_深圳猎头公司_广州猎头公司-广东万诚猎头提供企业中高端人才招聘服务 | 企业微信营销_企业微信服务商_私域流量运营_艾客SCRM官网 | 北京三友信电子科技有限公司-ETC高速自动栏杆机|ETC机柜|激光车辆轮廓测量仪|嵌入式车道控制器 | 搪玻璃冷凝器_厂家-越宏化工设备 | 定量包装秤,吨袋包装称,伸缩溜管,全自动包装秤,码垛机器人,无锡市邦尧机械工程有限公司 | 齿轮减速机电机一体机_齿轮减速箱加电机一体化-德国BOSERL蜗轮蜗杆减速机电机生产厂家 | Magnescale探规,Magnescale磁栅尺,Magnescale传感器,Magnescale测厚仪,Mitutoyo光栅尺,笔式位移传感器-苏州连达精密量仪有限公司 | 隔爆型防爆端子分线箱_防爆空气开关箱|依客思 | 超声波焊接机,振动摩擦焊接机,激光塑料焊接机,超声波焊接模具工装-德召尼克(常州)焊接科技有限公司 | 东莞韩创-专业绝缘骨架|马达塑胶零件|塑胶电机配件|塑封电机骨架厂家 | 合肥宠物店装修_合肥宠物美容院装修_合肥宠物医院设计装修公司-安徽盛世和居装饰 | 哈希PC1R1A,哈希CA9300,哈希SC4500-上海鑫嵩实业有限公司 | 深圳美安可自动化设备有限公司,喷码机,定制喷码机,二维码喷码机,深圳喷码机,纸箱喷码机,东莞喷码机 UV喷码机,日期喷码机,鸡蛋喷码机,管芯喷码机,管内壁喷码机,喷码机厂家 | 河南中整光饰机械有限公司-抛光机,去毛刺抛光机,精密镜面抛光机,全自动抛光机械设备 | 大_小鼠elisa试剂盒-植物_人Elisa试剂盒-PCR荧光定量试剂盒-上海一研生物科技有限公司 | 电杆荷载挠度测试仪-电杆荷载位移-管桩测试仪-北京绿野创能机电设备有限公司 | 干粉砂浆设备_干混砂浆生产线_腻子粉加工设备_石膏抹灰砂浆生产成套设备厂家_干粉混合设备_砂子烘干机--郑州铭将机械设备有限公司 | 煤棒机_增碳剂颗粒机_活性炭颗粒机_木炭粉成型机-巩义市老城振华机械厂 | 深圳市东信高科自动化设备有限公司 | 半自动预灌装机,卡式瓶灌装机,注射器灌装机,给药器灌装机,大输液灌装机,西林瓶灌装机-长沙一星制药机械有限公司 | 洗砂机械-球磨制砂机-洗沙制砂机械设备_青州冠诚重工机械有限公司 | 青岛成人高考_山东成考报名网 | 南京办公用品网-办公文具用品批发-打印机耗材采购 | 合肥汽车充电桩_安徽充电桩_电动交流充电桩厂家_安徽科帝新能源科技有限公司 | 江西自考网| 房车价格_依维柯/大通/东风御风/福特全顺/江铃图片_云梯搬家车厂家-程力专用汽车股份有限公司 | 本安接线盒-本安电路用接线盒-本安分线盒-矿用电话接线盒-JHH生产厂家-宁波龙亿电子科技有限公司 | 北京发电机出租_发电机租赁_北京发电机维修 - 河北腾伦发电机出租 | EPK超声波测厚仪,德国EPK测厚仪维修-上海树信仪器仪表有限公司 | 英国雷迪地下管线探测仪-雷迪RD8100管线仪-多功能数字听漏仪-北京迪瑞进创科技有限公司 | [官网]叛逆孩子管教_戒网瘾学校_全封闭问题青少年素质教育_新起点青少年特训学校 |