支援Nacos 2.1.0!這套Spring Cloud Gateway + Oauth2 微服務許可權終極解決方案升級了!
最近經常有小夥伴問我關於在微服務中使用Oauth2的問題,其實之前已經寫過一篇相關文章了。這次抽空把之前文章中的Demo給升級了,支援了最新版的Spring Cloud和Nacos。今天再來介紹下這套微服務許可權終極解決方案,希望對大家有所幫助!
SpringCloud實戰電商專案mall-swarm
(8.8k+star)地址:http://github.com/macrozheng/mall-swarm
實現思路
首先還是來聊聊這套解決方案的實現思路,我們理想的解決方案應該是這樣的,認證服務負責統一認證,閘道器服務負責校驗認證和鑑權,其他API服務則負責處理自己的業務邏輯。安全相關的邏輯只存在於認證服務和閘道器服務中,其他服務只是單純地提供服務而沒有任何安全相關邏輯。
這套解決方案中相關服務的劃分如下:
micro-oauth2-gateway
:閘道器服務,負責請求轉發和鑑權功能,整合Spring Security+Oauth2;micro-oauth2-auth
:認證服務,負責對登入使用者進行認證,整合Spring Security+Oauth2;micro-oauth2-api
:API服務,受閘道器服務的保護,使用者鑑權通過後可以訪問該服務,不整合Spring Security+Oauth2。
升級注意點
- 這裡專案的依賴版本都升級了,支援
SpringBoot 2.7.0
和最新版的Spring Cloud;
xml
<properties>
<spring-boot.version>2.7.0</spring-boot.version>
<spring-cloud.version>2021.0.3</spring-cloud.version>
<spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version>
</properties>
- 這裡不得不吐槽下Spring Cloud的版本號,之前名字採用了倫敦地鐵站的名字,根據字母表的順序來對應版本時間順序,後來又改成了年份,現在又添加了之前廢棄的地鐵站名字作為別名,真是讓人迷惑;
- SpringBoot 2.7.0版本中使用Maven外掛需要新增版本號;
xml
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
</plugin>
- 最新版本的Spring Cloud已經放棄使用Ribbon來做負載均衡了,轉而使用LoadBalancer,所以閘道器服務
micro-oauth2-gateway
中還需新增LoadBalancer依賴;
xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
- 如果不新增LoadBalancer依賴,從閘道器呼叫任意服務會返回
Service Unavailable
錯誤資訊;
json
{
"timestamp": "2022-06-28T02:36:31.680+00:00",
"path": "/auth/oauth/token",
"status": 503,
"error": "Service Unavailable",
"requestId": "c480cefa-1"
}
micro-oauth2-auth
認證服務需要升級版本,注意使用的JWT庫也要同步升級;
xml
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-oauth2</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>com.nimbusds</groupId>
<artifactId>nimbus-jose-jwt</artifactId>
<version>9.23</version>
</dependency>
</dependencies>
- 下載Nacos 2.1.0版本,下載地址:http://github.com/alibaba/nacos/releases
- 下載完成後解壓到指定目錄即可,使用如下命令啟動Nacos;
bash
startup.cmd -m standalone
- 訪問Nacos控制檯,使用賬號密碼
nacos:nacos
進行登入,訪問地址:http://localhost:8848/nacos/
使用
本文僅作為微服務許可權終極解決方案,Spring Cloud Gateway + Oauth2 實現統一認證和鑑權! 升級版本的補充,具體程式碼實現可以參考該文,下面演示下該解決方案中的統一認證和鑑權功能。
- 首先需要啟動Nacos和Redis服務,然後依次啟動
micro-oauth2-auth
、micro-oauth2-gateway
及micro-oauth2-api
服務,啟動完成後Nacos服務列表顯示如下;
- 使用密碼模式獲取JWT令牌,訪問地址:http://localhost:9201/auth/oauth/token
- 不帶JWT令牌訪問受保護的API介面,訪問地址:http://localhost:9201/api/hello
- 帶JWT令牌訪問受保護的API介面,注意請求頭
Authorization
新增Bearer
字首,可以正常訪問;
- 使用獲取到的JWT令牌訪問獲取當前登入使用者資訊的介面,訪問地址:http://localhost:9201/api/user/currentUser
- 當JWT令牌過期時,使用介面返回的
refreshToken
獲取新的JWT令牌,訪問地址:http://localhost:9201/auth/oauth/token
- 使用沒有訪問許可權的
andy:123456
賬號登入,訪問介面時會返回如下資訊,訪問地址:http://localhost:9201/api/hello
總結
在微服務系統中實現許可權功能時,我們不應該把重複的許可權校驗功能整合到每個獨立的API服務中去,而應該在閘道器做統一處理,然後通過認證中心去統一認證,這樣才是優雅微服務許可權解決方案!
專案原始碼地址
http://github.com/macrozheng/springcloud-learning/tree/master/micro-oauth2
- 還在用HttpUtil?SpringBoot 3.0全新HTTP客戶端工具來了,用起來夠優雅!
- Markdown還能這麼玩?這款開源神器絕了!
- MyBatis這樣用,同事直呼哇塞,堪稱最佳實踐!
- MyBatis-Plus同款Elasticsearch ORM框架,用起來夠優雅!
- 告別if else!試試這款輕量級流程引擎吧,自帶IDEA外掛真香!
- 堪稱一站式管理平臺,同時支援Linux、MySQL、Redis、MongoDB視覺化管理!
- 5分鐘自建資料庫視覺化平臺,線上管理資料庫也太方便了!
- 我上線了一個炫酷的專案實戰教程網站,主流技術一網打盡!
- 10 款更先進的開源命令列工具,太炫酷了!
- 看了我常用的IDEA外掛,同事也開始悄悄安裝了...
- 推薦一款微軟出品的開發神器,體驗不輸IDEA!
- 老版本Typora強制付費!試試這款開源替代品!
- 僅需一個依賴給Swagger換上新面板,既簡單又炫酷!
- 支援Nacos 2.1.0!這套Spring Cloud Gateway Oauth2 微服務許可權終極解決方案升級了!
- 還在用命令列看日誌?快用Kibana吧,視覺化日誌分析YYDS!
- Mall電商實戰專案全面升級!支援最新版SpringBoot,徹底解決迴圈依賴...
- 阿里出品!SpringBoot應用自動化部署神器,IDEA版Jenkins?
- 再見命令列!一鍵部署應用到遠端伺服器,IDEA官方Docker外掛真香!
- 還在用Navicat?這款開源的資料庫管理工具介面更炫酷!
- 還在從零開始搭建專案?這款升級版快速開發腳手架值得一試!