Skip to content

SpringBoot 搭建 Spring Security RBAC模型權限系統,Redis 實現 Cache 優化 Jwt 授權功能,Spring Data jpa 搭配 Jta Atomikos 連接 MySQL,Docker啟動專案。

Notifications You must be signed in to change notification settings

Hardcoreyoyo/Springboot-RBAC-Security-Redis-jpa-Mysql-Docker

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Springboot-RBAC-Security-Redis-jpa-Mysql-Docker



Structure





Execute

cd Springboot-RBAC-Security-Redis-jpa-Mysql-Docker     (Folder)
AllStart.sh




Feature

Dependency Version
Spring Boot 2.2.5.RELEASE
Spring Web by parent version
Spring Security /
Spring Data Jpa /
Spring log4j2 /
Spring Mail /
Spring Thymeleaf /
Spring Jta Atomikos /
Spring Cache /
Spring Redis /
Spring Actuator /
lombok 1.18.18
okhttp3 4.7.2
jjwt 0.9.0
Maven 3
Docker v20.10.10




Administrator Api

api Service Method
localhost:8080
/admin 管理員中心 GET
/read/{name} 查詢會員資料 GET
/create/{username}/{password}/{email} 建立會員資料 POST
/update/{username} 更變會員資料 PUT
/delete/{username} 刪除會員資料 DELETE
/admin/query/all/{page}/{size} 查詢所有會員資訊 GET

User Api

api Service Method
localhost:8080
/auth 登入 GET
POST
/refresh 刷新登入 Token POST
/member 會員中心 GET
/signup 註冊 GET
POST
/email/confirm 驗證註冊 Email Token GET
/user/reset/send 重置密碼 GET
POST
/user/change/pwd 更變密碼 GET
POST
/user/reset/confirm 輸入新密碼
驗證更變密碼 Email Token
GET
POST

OAuth Api

api Service Method
localhost:8080
/oauth 第三方登入 GET
/callback 驗證 授權碼 GET




Troubleshooting

Trouble solve
響應格式不一又複雜 預設是前後端分離,用 RESTful 格式,返回 json 給前端,
創建 ResponseMapper class 統一響應格式,
Status (boolean) + http code (響應 http 代碼)
+ Message(錯誤訊息給前端判斷) + Data(前端要的資料)。
給用戶的不友好異常訊息
http code 簡化
創建 ExceptionIndividual class 使用 @ExceptionHandler 捕獲異常,
將 http code 統一訂為 200 400 500 999(未知異常) 提供給前端。
統一異常處理的漏網之魚 Spring Security 部分異常處理捕捉不到,
查看框架源碼發現異常在 filter 層就已經處理了,
@ExceptionHandler 只抓得到 controller 層的異常,
實作 Spring Security 異常處理 interface,調整 filter 順序。
SQL 重複性高 基本增刪改查權限系統,業務邏輯大多相同不太複雜,
將 spring data jdbc 改為 ORM 框架 spring data jpa ,
除了簡化開發流程還可以避免 SQL Injection
寄信功能響應緩慢 將寄信功能改為異步 @Async,
使用 springboot 封裝好的線程池 ThreadPoolExecutor,
調整隊列小於線程數,避免死鎖,將鎖配置逾時時間 ,
不同業務邏輯線程池不共用。
一致性問題 儲存引擎改用 innoDB 可支持 @Transaction,
對增刪改的業務邏輯增加 @Transaction。
隔離級別調整 MySQL 預設 repeatable read,先改為 Read committed,
至少避免髒讀跟更新不一致,性能不會太差,
如其他業務邏輯需要處理不可重讀跟幻讀,
再看情況使用悲觀鎖或樂觀鎖來控制。
SQL 查詢優化 User 表的 username 欄位查詢頻繁,基數大,增添索引一般索引,
EXPLAIN 執行計畫數據顯示查詢效率提升:
type : ALL -> ref
row : max -> 1
對 Role 表 role 欄增添索引
type : ALL -> ref
對Url 表 url 欄增添索引
type : ALL -> ref
(考慮使用 Partition 減少每次觸及到的資料量)
session 效能問題 授權的部分把 session 改用 jwt,再跟 spring security 做整合。
JWT 查詢效率低落 改為 JWT 授權等於每次 request 都要去資料庫做查詢,
加上是多讀少寫的情境適合加 cache 優化查詢,用 Redis 實現 。
或是把所有權限資訊及可訪問的api全部存入 token,
這樣後續就不用每次都去數據庫查。但 token 大小有疑慮。
緩存穿透問題 spring.cache.redis.cache-null-values=true
考慮優化緩存穿透 hash 或 boolen filter
考慮 優化 將 redis 做主從設計
多資料庫一致性問題 引入 Spring Jta Atomikos 做 Transaction Managment
打包路徑結構改變問題 使用 Maven 打包後會使結構路徑產生變化,
造成讀取不到靜態檔案預設位置,
application 設定檔案加上,
spring.thymeleaf.prefix=classpath:/templates。




Best Further

提高 QPS 與 Concurrency 能力

  1. 多實例應用做水平擴充
  2. nginx 做反向代理,負載均衡
  3. RabbitMQ 更換 Atomikos 實現最終一致性
    解決高耦合,阻塞。(Transactional Outbox OR CDC)
  4. 資料庫可以再做 shading

About

SpringBoot 搭建 Spring Security RBAC模型權限系統,Redis 實現 Cache 優化 Jwt 授權功能,Spring Data jpa 搭配 Jta Atomikos 連接 MySQL,Docker啟動專案。

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages