網關上認證去做哪些改造
在網關上用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的控制台