不用權限框架,基於 Spring Boot 2.x 構建一個最基礎的權限系統

本項目是使用SpringBoot2構建的一套基於RBAC權限模型的後臺管理系統,前端是微信小程序。

項目地址:

https://github.com/fuyunwang/DrivingAgency

項目的緣由

最近接了個外包,主要是針對於駕校開發一個代理小程序。目的是為了方便駕校的管理來招攬學員,同時方便維護學員和代理信息。

項目介紹

項目業務功能介紹

本項目的業務需求比較少,是一個傳統項目,核心的業務點是權限管理,這裡我就採用比較規範的RBAC權限模型來開發。由於項目比較小,這裡我就沒有采用Shiro或SpringSecurity等權限管理框架,而是自己使用過濾器開發了一套。我認為這可以算是權限管理的雛形,如果有更復雜的權限管理需求,可以很方便的基於此擴展。

  1. 管理員角色為最高權限,賬戶為admin,初始密碼為123456。
  2. 管理員可以創建一級代理、添加學員。
  3. 一級代理可以創建二級代理、添加學員。但是一級代理創建的代理和學員初始為未審核狀態,只有超管才能審核
  4. 二級代理只有在審核通過後才能添加學員且二級代理不能創建代理。
  5. 針對每個代理獲取其下的所有學員,如果是超管或一級代理獲取其添加學員的同時獲取其下子代理的學員。
  6. 排行榜系統。根據每個代理所添加的代理或學員數(包括子代理的學員數)來確定代理的業績。獲得日業績排行和總業績排行
  7. 針對排行榜中的代理進行點贊和評論。

技術實現

  1. 首先認證方面,我這裡仍然採用jwt token的認證方式。這裡我默認實現了記住密碼的功能。即用戶第一次登陸成功之後返回一個token在response header中,該token的有效期為2小時,服務器端我保存一個有效期為1周的refresh token。用戶在2個小時之內登錄不會返回token,2個小時和一週之內第一次攜帶過期token我會返回新的token在response header。一週之外refresh token失效,這裡需要用戶重新登錄。 這裡我也是借鑑了別人的思路:https://segmentfault.com/a/1190000013151506
  2. 權限管理方面,我這裡共用了4張表,其實基準的RBAC權限模型最少要5張表。這裡比較簡單,所以我主要是用戶表、角色表、權限表以及權限角色表。用戶和角色是一對一的關聯關係、角色和權限是一對多的關係。表結構如下:
不用權限框架,基於 Spring Boot 2.x 構建一個最基礎的權限系統

不用權限框架,基於 Spring Boot 2.x 構建一個最基礎的權限系統

  1. Filter實現權限過濾。這裡比較簡單,但是記錄一個比較雞肋的事。就是在SpringBoot中使用Filter時,SpringBoot提供了 @ServletComponentScan(basePackages="com.beautifulsoup.driving")和 @WebFilter及 @Order註解,但是這裡的 @Order並不能實現多個Filter的順序性,無奈我只能採用 FilterRegistrationBean來注入Filter,同時請求第一步進入的是Filter且其不被Spring管理,故而不能通過 @Autowired註解只能構造方法注入。Filter內部用ThreadLocal保存用戶信息,校驗用戶的權限,ThreadLocal作為線程級別對象,對於SpringSecurity中的用戶信息保存也是基於此的。
  2. 數據訪問層,這裡我使用的Spring Data。包括Spring Data Jpa和Spring Data Mongodb。傳統項目沒必要針對SQL做太多優化,這裡我就純ORM。
  3. 排行榜系統,仍然是記錄用戶添加代理和學員之後記錄入Redis。ZSET記錄用戶的日業績和總業績,然後將前10名從Hash中返回,提升效率。
  4. 點贊仍然使用Redis維護代理的點贊數、評論數據入Redis。
  5. 導出Excel,方便管理員維護代理和學員數據,這裡採用Apache POI

小程序界面展示:

不用權限框架,基於 Spring Boot 2.x 構建一個最基礎的權限系統

不用權限框架,基於 Spring Boot 2.x 構建一個最基礎的權限系統

不用權限框架,基於 Spring Boot 2.x 構建一個最基礎的權限系統

不用權限框架,基於 Spring Boot 2.x 構建一個最基礎的權限系統

不用權限框架,基於 Spring Boot 2.x 構建一個最基礎的權限系統

接口文檔:

文檔地址:

https://github.com/fuyunwang/DrivingAgency/wiki/%E9%A9%BE%E6%A0%A1%E4%BB%A3%E7%90%86%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%90%8E%E7%AB%AFAPI%E8%AF%B4%E6%98%8E%E6%96%87%E6%A1%A3#25%E7%BB%99%E6%8C%87%E5%AE%9A%E4%BB%A3%E7%90%86%E8%AF%84%E8%AE%BA

例子:

不用權限框架,基於 Spring Boot 2.x 構建一個最基礎的權限系統

技術包括

  1. Spring Boot 2.1.3
  2. Spring Data Jpa
  3. Spring Data Redis
  4. Spring Data Mongodb
  5. Spring Boot Mail
  6. Swagger
  7. Quartz
  8. JWT Token
  9. FastDFS
  10. apache poi

要點

  1. 熱點數據入Redis,提高SQL的查詢性能
  2. 認證採用Jwt Token+Refresh Token+黑名單策略,提高用戶體驗
  3. 權限管理採用規範的RBAC權限模型
  4. 點贊、排行等數據入Redis,每天進行一次Quartz任務調度,Redis中數據落庫
  5. 評論、發佈公告等信息入Mongodb,便於存儲、操作

由於能力有限,若有錯誤或者不當之處,還請大家批評指正,一起學習交流!

地址:https://juejin.im/post/5ca1b08fe51d455201119177


分享到:


相關文章: