shenyu怎么處理sign鑒權(quán)前置到網(wǎng)關(guān)
前言
shenyu以前叫soul網(wǎng)關(guān),我比較早關(guān)注它的,直到前不久看到它們創(chuàng)始人發(fā)的朋友圈,才知道現(xiàn)在已經(jīng)是apache頂級(jí)項(xiàng)目了,666
今天我點(diǎn)了下shenyu issue里頭逛逛,發(fā)現(xiàn)了一個(gè)老哥說(shuō)能否做到對(duì)簽名插件的擴(kuò)展,然后我就去看了shenyu里頭怎么實(shí)現(xiàn)驗(yàn)簽的
加了他們創(chuàng)始人微信挺久了,也關(guān)注shenyu網(wǎng)關(guān)一段時(shí)間,因?yàn)楸旧碓诩軜?gòu)組也會(huì)接觸網(wǎng)關(guān)內(nèi)容
shenyu網(wǎng)關(guān)
shenyu跟其他網(wǎng)關(guān)一樣,都是通過(guò)責(zé)任鏈的方式,這樣可以靈活進(jìn)行擴(kuò)展,也能做到每個(gè)處理類(lèi)都難處理到。
我目前項(xiàng)目也有鑒權(quán)功能,也看看別人是怎么實(shí)現(xiàn)的
鑒權(quán)sign
首先肯定是找到對(duì)應(yīng)的模塊,shenyu-plugin-sign,SignPlugin 就是網(wǎng)關(guān)處理鏈條中的一環(huán)。
@Bean public ShenyuPlugin signPlugin(final SignService signService) { return new SignPlugin(signService); }
就是你在項(xiàng)目里頭注入哪個(gè)SignService實(shí)現(xiàn)類(lèi),它會(huì)塞到這插件里頭來(lái)。
它會(huì)去判斷規(guī)則是否存在,什么規(guī)則?就是驗(yàn)證簽名的時(shí)候那些配置,比如說(shuō)多久超時(shí),哪些url要通過(guò)sign驗(yàn)簽。
但是這里也暴露了一個(gè)問(wèn)題,過(guò)度依賴(lài)配置,如果做到高可用,可以做一層backup備份,如果沒(méi)有配置,或者配置讀不到的情況下,讀取上次配置的內(nèi)容。
DefaultSignService
這里有個(gè)比較好的東西,就是會(huì)將一些內(nèi)容封裝到上下文里頭,比如說(shuō)a節(jié)點(diǎn),處理了一個(gè)東西,還要set一個(gè)特殊的key到header里面,然后讓后面的去拿,這就很不方便了,如果是放在上下文的話,這就統(tǒng)一處理。
驗(yàn)簽邏輯開(kāi)始,首先是對(duì)時(shí)間做驗(yàn)證,然后再是算法驗(yàn)。
這里我要直呼一聲好家伙,exchange.getRequest().getQueryParams()直接拿到請(qǐng)求的參數(shù),如果你在服務(wù)里面實(shí)現(xiàn)那得累死你,區(qū)分post、get請(qǐng)求,需要特殊處理。
buildParamsMap(shenyuContext, requestBody)
這個(gè)map里頭有啥?加了時(shí)間戳、url、版本號(hào),請(qǐng)求參數(shù)(去除sign)
DigestUtils.md5DigestAsHex(sign.getBytes()).toUpperCase()
這里是sign簽名算法
總結(jié)
到這里,shenyu的sign插件邏輯就差不多了,直呼好家伙,跟我現(xiàn)在項(xiàng)目里頭驗(yàn)簽邏輯一毛一樣,只是簽名算法有所不同。但是這里面還是有些能優(yōu)化的點(diǎn),比如說(shuō)過(guò)度依賴(lài)shenyu現(xiàn)有的配置內(nèi)容,需要做到網(wǎng)關(guān)點(diǎn)高可用~
shenyu這里跟其他配置中心也有所不一樣,采用map來(lái)接收配置內(nèi)容,我們看nacos、apolla這些框架是刷新到eventment環(huán)境變量里頭去。
以上就是shenyu怎么處理sign鑒權(quán)前置到網(wǎng)關(guān)的詳細(xì)內(nèi)容,更多關(guān)于shenyu處理sign鑒權(quán)前置網(wǎng)關(guān)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- SpringBoot整合SpringSecurityOauth2實(shí)現(xiàn)鑒權(quán)動(dòng)態(tài)權(quán)限問(wèn)題
- 基于 Python實(shí)現(xiàn)云服務(wù)器的CDN域名遠(yuǎn)程鑒權(quán)配置
- 鑒權(quán)認(rèn)證+aop+注解+過(guò)濾feign請(qǐng)求的實(shí)例
- 使用Feign設(shè)置Token鑒權(quán)調(diào)用接口
- springCloud gateWay 統(tǒng)一鑒權(quán)的實(shí)現(xiàn)代碼
- SpringCloud中Gateway實(shí)現(xiàn)鑒權(quán)的方法
相關(guān)文章
淺談java Iterator.remove()方法的用法(詳解)
下面小編就為大家?guī)?lái)一篇淺談java Iterator.remove()方法的用法(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01詳解Java中ByteArray字節(jié)數(shù)組的輸入輸出流的用法
ByteArrayInputStream和ByteArrayOutputStream分別集成自InputStream和OutputStream這兩個(gè)輸入和輸出流,這里我們就來(lái)詳解Java中ByteArray字節(jié)數(shù)組的輸入輸出流的用法,需要的朋友可以參考下2016-06-06Java 中 Date 與 Calendar 之間的編輯與轉(zhuǎn)換實(shí)例詳解
這篇文章主要介紹了Java 中 Date 與 Calendar 之間的編輯與轉(zhuǎn)換 ,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07ibatis結(jié)合oracle批量插入三種方法的測(cè)評(píng)
今天小編就為大家分享一篇關(guān)于ibatis結(jié)合oracle批量插入三種方法的測(cè)評(píng),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12Maven中怎么手動(dòng)添加jar包到本地倉(cāng)庫(kù)詳解(repository)
這篇文章主要給大家介紹了關(guān)于Maven中怎么手動(dòng)添加jar包到本地倉(cāng)庫(kù)的相關(guān)資料,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-04-04Java8新日期時(shí)間API的20個(gè)使用示例
這篇文章主要介紹了Java8新日期時(shí)間API的20個(gè)使用示例,為了學(xué)習(xí)Java 8的這個(gè)新庫(kù),這里我創(chuàng)建了20個(gè)以任務(wù)為導(dǎo)向的例子,需要的朋友可以參考下2015-03-03Spring Boot熱加載jar實(shí)現(xiàn)動(dòng)態(tài)插件的思路
本文主要介紹在 Spring Boot 工程中熱加載 jar 包并注冊(cè)成為 Bean 對(duì)象的一種實(shí)現(xiàn)思路,在動(dòng)態(tài)擴(kuò)展功能的同時(shí)支持在插件中注入主程序的 Bean 實(shí)現(xiàn)功能更強(qiáng)大的插件2021-10-10Ubuntu搭建Java開(kāi)發(fā)環(huán)境筆記
這篇文章主要介紹了Ubuntu搭建Java開(kāi)發(fā)環(huán)境筆記,本文講解了JDK安裝、MyEclipse安裝及第一個(gè)Hello world程序等內(nèi)容,需要的朋友可以參考下2015-03-03mybatis自定義參數(shù)類(lèi)型轉(zhuǎn)換器數(shù)據(jù)庫(kù)字段加密脫敏
這篇文章主要為大家介紹了mybatis自定義參數(shù)類(lèi)型轉(zhuǎn)換器數(shù)據(jù)庫(kù)字段加密脫敏,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09