Spring cloud微服務安全實戰-6-3JWT改造之網關和服務改造


網關上認證去做哪些改造
在網關上用jwt去解析用戶信息,而不再發送校驗令牌的請求了。

之前的時候網關上實際上寫了很多的代碼

包括認證,發check_token去把token請求,換成用戶信息。

這倆是審計日志和授權。

自己寫了個MeFilter獲取用戶的信息

限流

filter都刪掉,Spring Security和Spring OAuth 已經把所有的都封裝好了。除了限流和日志。審計、認證、授權都封裝好了。

用Spring Security實現功能

加入Starter-oauth2的依賴。

本節課先講認證相關的功能。我們現在不再發校驗令牌的請求,而是直接從jwt里面讀取用戶的信息,jwt的信息會有一個簽名,讀取信息的時候要去驗這個簽名,驗簽名的時候需要有一個key,key我們需要在Gateway啟動的時候,從認證服務器獲取到這個key

key-uri首先要配置從哪里拿key。這里應該配置的是認證服務器的地址。




tokenKey源碼在這里

TokenKeyEndpoint來處理,/oauth/token_key這個請求。

它就會把證書里面存的密鑰返回

上節課配置tokenStore的時候

下面配置配置了tokenKeyAccess。就是說訪問這個tokenKeyUrl的時候必須要身份認證。

所以在這里我就要告訴他身份認證的信息。clinetId和clientSceret


網關就是gateway密碼是123456

這和我們數據庫的記錄是對應的。數據庫內有這條記錄才會生效。

配置資源服務器相關的配置

網關是作為資源服務器存在的,所以繼承ResourceServerConfigAdapter



我們自己寫的認證的時候,我們要把所有/token的請求都放過去,因為/token開頭的請求都是在申請令牌,你不能讓申請令牌的這些請求也需要身份認證。

默認情況下所有的請求都需要身份認證。

我們在這里 加一句,申請令牌的所有請求都放行。不需要帶令牌。

如果你還有其他的路徑需要放行的直接在這里逗號分隔開 繼續加字符串就可以了。這里的antMathers是個復數的形式。

order-api

我們在網關里面把filter都去掉了。已經不再傳明文的username了。這個時候order-api也需要修改代碼
因為oauth2的依賴。

也需要響應的配置,令牌傳遞過來,它也需要從令牌里解析當前用戶是誰。因為我們傳的是一個令牌,而不是明文的一個東西了。



在啟動類里面加注解@EnableResourceServer

拿到用戶名,通過@AuthenticationPrincipal注解

啟動測試

啟動網關


在沒有啟動認證服務器的時候,直接啟動網關 會報錯。鏈接被拒絕,

它在啟動的時候會去找認證服務器,拿簽名的key。認證服務器如果還沒有啟動,連不上,所以會報錯。你拿不到這個key 就沒法驗jwt

所以首先啟動認證服務器,OAuth2的認證服務器。

然后再啟動網關、

再次啟動網關的時候又報了個404的錯誤。就是剛才那個拿key的路徑沒有。

這是因為我們在配置Oauth2認證服務器的時候,改tokenStore的時候,聲明的是私有的JwtAccessTokenConverter

這個類要聲明稱公有的,而且還要是Spring的一個Bean。只有在有這個Bean的情況下。

tokenKeyEndpoint這個端點才會起作用。

這個請求才會被處理

如果沒有這個public的Bean。這個端點是不會暴露的,所以就會報404 的錯誤。

重啟認證服務器

網關重啟

網關就能成功的啟動了。

啟動orderapi


首先來獲取令牌



我把數據庫內的令牌的過期時間改了 之前為了測試改的10秒。這次再改的長一點。

通過網關調用創建訂單的服務

403錯誤。無效的token,不包含resource id oauth2-resouce 這說明我們的resouceid的檢查沒過。

針對admin發出去的令牌,它的resource_id是order-server

報錯的oauth2-server是哪里的呢???我們在配置網關的時候,沒有指定resource_id

默認情況下沒有指定resourceId的情況,這個類里面會有一個默認的resourceId.進入到ResourceServerSerurityConfigurer

因為網關沒有配置,所以默認的就是這個類里的resourceId,oauth2-resource


我們在發出去的令牌只能訪問order-server

所以這個令牌在訪問網關的時候,就被攔下來了。令牌是對的。但是沒有權限。


令牌隨便加個字母訪問,錯誤的令牌就是401

令牌都沒過,無法從令牌里面知道你是誰。invalid_token無效的令牌。


我們之前在網關上做的認證和權限判斷,就是返回401和403兩個事,實際上,spring  security已經幫我們都做了。 
我們看到了它上面基友401認證的判斷,也有403權限的判斷。

解決方法

在數據庫內,這里加一個gateway

然后把網關的resourceId配置成gateway


再重新發一個令牌,這個令牌再去訪問網關,就可以過去了。

這種方式的好處就是你可以控制權限。這個令牌能訪問誰,不能訪問誰,自己可以控制。不好的地方就是麻煩,每次都要自己改數據,代碼里還要做相應的編碼。
比如說這里的名字你編譯下,數據庫內的數據也要跟着改。這樣還是需要一些維護的工作的。

另外一種方式

數據庫內 這里啥都不填,這樣發出去的令牌就可以訪問所有的resourceId

配置gateway的resourceId也去掉。

這里我們就是通過數據庫配置為空的方式了。

重新測試

重新申請令牌。

新凌派就是可以訪問任何的資源服務器。

訪問創建訂單的服務。



創建訂單的控制台,把用戶名打印出來。




發了jwt后,在網關的時候,沒有去校驗令牌,在網關解析了jwt,判斷這個jwt是有效的,再往下,jwt給到訂單服務的時候,訂單服務從jwt解析出來這個令牌對應的用戶是jojo


解決最后一個問題,令牌如何傳遞


訂單服務想去調庫存服務的時候,令牌如何往下傳。仍然要從請求里面拿到令牌,放到請求頭里。但是spring security已經幫我封裝了。不用自己去做。只需要用他的一個工具類就可以了。

價格服務

價格服務也加上oauth2的依賴


加上配置,配置從哪里拿tokenKey



數據庫內沒有priceService

把orderApp改成priceService ,密碼是復制上面gateway的密碼。

獲取用戶名


輸出用戶名

 

修改orderController

在請求上把令牌帶上。不再用原來的restTemplate了 ,而是用SpringSecurity提供的OauthRestTemplate

OauthRestTemplate功能就是從你當前請求的上下文里,拿到令牌,然后把令牌放到請求頭里面。然后再出去。只要用OauthRestTemplate來發請求就會自動帶上請求頭。

在springboot的啟動類聲明oauth2RestTemplate

這個方法。 需要用到兩個參數。

進入到OAuth2RestTemplate這個類里面。

復制這兩個參數出來。




復制到方法的參數里就可以了。這兩個參數springboot已經幫我們聲明好了。直接寫在方法參數里,springboot就會替我們把這倆參數傳進來。
然后直接傳給這個OAuth2ResetTemplate就可以了。

啟動測試

orderAPi和priceAPI都啟動起來。
聽過網關來調創建訂單。



priceAPi的控制台

結束


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM