當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
微服务接入oauth2_微服务权限终极解决方案,Spring Cloud Gateway+Oauth2实现统一认证和鉴权!...
生活随笔
收集整理的這篇文章主要介紹了
微服务接入oauth2_微服务权限终极解决方案,Spring Cloud Gateway+Oauth2实现统一认证和鉴权!...
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近發現了一個很好的微服務權限解決方案,可以通過認證服務進行統一認證,然后通過網關來統一校驗認證和鑒權。此方案為目前最新方案,僅支持Spring Boot 2.2.0、Spring Cloud Hoxton 以上版本,本文將詳細介紹該方案的實現,希望對大家有所幫助!
SpringCloud實戰電商項目mall-swarm(5.1k+star)地址:https://github.com/macrozheng/mall-swarm
前置知識
我們將采用Nacos作為注冊中心,Gateway作為網關,使用nimbus-jose-jwtJWT庫操作JWT令牌,對這些技術不了解的朋友可以看下下面的文章。- Spring Cloud Gateway:新一代API網關服務
- Spring Cloud Alibaba:Nacos 作為注冊中心和配置中心使用
- 聽說你的JWT庫用起來特別扭,推薦這款賊好用的!
應用架構
我們理想的解決方案應該是這樣的,認證服務負責認證,網關負責校驗認證和鑒權,其他API服務負責處理自己的業務邏輯。安全相關的邏輯只存在于認證服務和網關服務中,其他服務只是單純地提供服務而沒有任何安全相關邏輯。相關服務劃分:
- micro-oauth2-gateway:網關服務,負責請求轉發和鑒權功能,整合Spring Security+Oauth2;
- micro-oauth2-auth:Oauth2認證服務,負責對登錄用戶進行認證,整合Spring Security+Oauth2;
- micro-oauth2-api:受保護的API服務,用戶鑒權通過后可以訪問該服務,不整合Spring Security+Oauth2。
方案實現
下面介紹下這套解決方案的具體實現,依次搭建認證服務、網關服務和API服務。micro-oauth2-auth
我們首先來搭建認證服務,它將作為Oauth2的認證服務使用,并且網關服務的鑒權功能也需要依賴它。- 在pom.xml中添加相關依賴,主要是Spring Security、Oauth2、JWT、Redis相關依賴;
- 在application.yml中添加相關配置,主要是Nacos和Redis相關配置;
- 使用keytool生成RSA證書jwt.jks,復制到resource目錄下,在JDK的bin目錄下使用如下命令即可;
- 創建UserServiceImpl類實現Spring Security的UserDetailsService接口,用于加載用戶信息;
- 添加認證服務相關配置Oauth2ServerConfig,需要配置加載用戶信息的服務UserServiceImpl及RSA的鑰匙對KeyPair;
- 如果你想往JWT中添加自定義信息的話,比如說登錄用戶的ID,可以自己實現TokenEnhancer接口;
- 由于我們的網關服務需要RSA的公鑰來驗證簽名是否合法,所以認證服務需要有個接口把公鑰暴露出來;
- 不要忘了還需要配置Spring Security,允許獲取公鑰接口的訪問;
- 創建一個資源服務ResourceServiceImpl,初始化的時候把資源與角色匹配關系緩存到Redis中,方便網關服務進行鑒權的時候獲取。
micro-oauth2-gateway
接下來我們就可以搭建網關服務了,它將作為Oauth2的資源服務、客戶端服務使用,對訪問微服務的請求進行統一的校驗認證和鑒權操作。- 在pom.xml中添加相關依賴,主要是Gateway、Oauth2和JWT相關依賴;
- 在application.yml中添加相關配置,主要是路由規則的配置、Oauth2中RSA公鑰的配置及路由白名單的配置;
- 對網關服務進行配置安全配置,由于Gateway使用的是WebFlux,所以需要使用@EnableWebFluxSecurity注解開啟;
- 在WebFluxSecurity中自定義鑒權操作需要實現ReactiveAuthorizationManager接口;
- 這里我們還需要實現一個全局過濾器AuthGlobalFilter,當鑒權通過后將JWT令牌中的用戶信息解析出來,然后存入請求的Header中,這樣后續服務就不需要解析JWT令牌了,可以直接從請求的Header中獲取到用戶信息。
micro-oauth2-api
最后我們搭建一個API服務,它不會集成和實現任何安全相關邏輯,全靠網關來保護它。- 在pom.xml中添加相關依賴,就添加了一個web依賴;
- 在application.yml添加相關配置,很常規的配置;
- 創建一個測試接口,網關驗證通過即可訪問;
- 創建一個LoginUserHolder組件,用于從請求的Header中直接獲取登錄用戶信息;
- 創建一個獲取當前用戶信息的接口。
功能演示
接下來我們來演示下微服務系統中的統一認證鑒權功能,所有請求均通過網關訪問。- 在此之前先啟動我們的Nacos和Redis服務,然后依次啟動micro-oauth2-auth、micro-oauth2-gateway及micro-oauth2-api服務;
- 使用密碼模式獲取JWT令牌,訪問地址:http://localhost:9201/auth/oauth/token
- 使用獲取到的JWT令牌訪問需要權限的接口,訪問地址:http://localhost:9201/api/hello
- 使用獲取到的JWT令牌訪問獲取當前登錄用戶信息的接口,訪問地址:http://localhost:9201/api/user/currentUser
- 當JWT令牌過期時,使用refresh_token獲取新的JWT令牌,訪問地址:http://localhost:9201/auth/oauth/token
- 使用沒有訪問權限的andy賬號登錄,訪問接口時會返回如下信息,訪問地址:http://localhost:9201/api/hello
項目源碼地址
https://github.com/macrozheng/springcloud-learning/tree/master/micro-oauth2
總結
以上是生活随笔為你收集整理的微服务接入oauth2_微服务权限终极解决方案,Spring Cloud Gateway+Oauth2实现统一认证和鉴权!...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: http post请求 参数放在路径后面
- 下一篇: ptaa乘以b_《C语言程序设计》实验作