首頁 > 科技

超全!華為內部頂級Spring Security全解筆記,認證授權一鍵搞定

2021-06-10 13:17:40

最近幾天在改造項目,需要將gateway整合security在一起進行認證和鑑權,之前gateway和auth是兩個服務,auth是shiro寫的一個,一個filter和一個配置,內容很簡單,生成token,驗證token,沒有其他的安全檢查,然後讓對項目進行重構。

先是要整合gateway和shiro,然而因為gateway是webflux,而shiro-spring是webmvc,所以沒搞成功,如果有做過併成功地,請告訴我如何進行整合,非常感謝。

那整合security呢,因為spring cloud gateway基於webflux,所以網上很多教程是用不了的,webflux的配置會有一些變化,具體看如下程式碼示例:

上面的示例程式碼,是我開源項目中的一段,一般的配置就如上面寫的,就可以使用了,但是由於我們之前的項目中的是shiro,然後有一個自定義的加密解密的邏輯。

首先說明一下情況,之前那一套加密(前端MD5,不加鹽,然後資料庫儲存的是加鹽後的資料和對應的鹽(每個賬號一個),要登入比較之前對密碼要獲取動態的鹽,然後加鹽進行MD5,再進行對比,但是在配置的時候是沒法獲取某一使用者的鹽值)

所以上面的一版配置是沒法通過驗證的,必須在驗證之前,給請求的密碼混合該賬號對應的鹽進行二次加密後在對比,但是這裡就有問題了:

security 框架提供的幾個加密解密工具沒有MD5的方式;security 配置加密解密方式的時候,無法填入動態的賬號的加密鹽;對於第一個問題還好處理,解決方式是:自定義加密解密方式,然後注入到配置類中,示例如下:

第二個問題的解決辦法,找了很多資料,也沒有找到,後來檢視security的源碼發現,可以在UserDetailsService介面的findByUsername()方法中,在返回UserDetails實現的時候,使用預設實現User的UserBuilder內部類來解決這個問題,因為UserBuilder類中有一個屬性,passwordEncoder屬性,它是Fucntion<String, String>類型的,預設實現是 password -> password,即對密碼不做任何處理,先看下它的源碼:

再看下解決問題之前的findByUsername()方法:

那找到了問題的解決方法,就來改程式碼了,如下所示:

新增一個程式碼處理方法

然後新增builder鏈

然後跑一下程式碼,請求登入介面,就登陸成功了。


IT145.com E-mail:sddin#qq.com