SpringSecurity權限管理系統實戰—1、項目簡介和開發環境準備
SpringSecurity權限管理系統實戰—2、日誌、接口文檔等實現
SpringSecurity權限管理系統實戰—3、主要頁面及接口實現
SpringSecurity權限管理系統實戰—4、整合SpringSecurity(上)
SpringSecurity權限管理系統實戰—5、整合SpringSecurity(下)
SpringSecurity權限管理系統實戰—6、SpringSecurity整合jwt
SpringSecurity權限管理系統實戰—7、處理一些問題
SpringSecurity權限管理系統實戰—8、AOP 記錄用戶日誌、異常日誌javascript
博主的文筆有些差,你們多擔待css
在企業應用中,認證和受權是很是重要的一部份內容,業界最出名的兩個框架就是大名鼎鼎的 Shiro和Spring Security。本次我選取的是和SpringBoot更好兼容的SpringSecurity。html
RBAC是Role Based Access Control的縮寫,是基於角色的訪問控制。通常都是分爲用戶(user), 角色(role),權限(permission)三個實體,角色(role)和權限(permission)是多對多的 關係,用戶(user)和角色(role)也是多對多的關係。用戶(user)和權限(permission) 之間沒有直接的關係,都是經過角色做爲代理,才能獲取到用戶(user)擁有的權限。前端
如下是RBAC0的模型java
詳細解釋見mysql
因爲本系統是邊開發寫此文檔的,因此可能上述的功能在後續的開發中會有刪改。jquery
本次系統非先後端分離項目,基於SpringBoot+Layui,後臺模板選用的是Pear Admin Layui (我目前見過最漂亮的layui後臺模板,放張圖片讓你們感覺一下)git
數據庫設計github
目前先這樣,以後還會擴展。web
在idea中新建SpringBoot項目,導入所需依賴
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!--這裏須要先把SpringSecurity註銷--> <!-- <dependency>--> <!-- <groupId>org.springframework.boot</groupId>--> <!-- <artifactId>spring-boot-starter-security</artifactId>--> <!-- </dependency>--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <!--swagger--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <!--swagger ui--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.2.7.RELEASE</version> <scope>compile</scope> </dependency> </dependencies>
在項目中把架構搭好,建立對應數據庫表的eneity、dao、service、controller,很是簡單不想佔用篇幅。須要注意的就是實體類中的create_time,和update_time,因爲這兩個和id是在多張表中都有出現,因此咱們能夠把它們抽離出來,有須要的實體類直接繼承就能夠了
@Data public abstract class BaseEntity<ID extends Serializable> implements Serializable { private static final long serialVersionUID = 8925514045582235838L; private ID id; private Date createTime = new Date(); @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date updateTime = new Date(); }
再插一嘴,@Data是lambok提供的一個註解,能夠用於生成實體類的get和set方法。使用須要導入maven依賴,在idea中也要安裝相應插件。如何安裝使用使用詳見
而後將PearAdmin的資源放入templates下
那麼接下來咱們先把項目運行起來,在index.html中加入thymeleaf的命名空間,經過thymeleaf的語法從新引入下資源。
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <link rel="stylesheet" th:href="@{/PearAdmin/component/layui/css/layui.css}" /> <link rel="stylesheet" th:href="@{/PearAdmin/admin/css/pearTab.css}" /> <link rel="stylesheet" th:href="@{/PearAdmin/admin/css/pearTheme.css}" /> <link rel="stylesheet" th:href="@{/PearAdmin/admin/css/pearLoad.css}" /> <link rel="stylesheet" th:href="@{/PearAdmin/admin/css/pearFrame.css}" /> <link rel="stylesheet" th:href="@{/PearAdmin/admin/css/pearAdmin.css}" /> <link rel="stylesheet" th:href="@{/PearAdmin/admin/css/pearNotice.css}" /> <link rel="stylesheet" th:href="@{/PearAdmin/admin/css/pearSocial.css}" /> <link rel="stylesheet" th:href="@{/PearAdmin/admin/css/pearMenu.css}" /> <style id="pearone-bg-color"></style> </head> <body class="layui-layout-body pear-admin"> <!-- 佈局框架 --> <div class="layui-layout layui-layout-admin"> <div class="layui-header"> <ul class="layui-nav layui-layout-left"> <li class="collaspe layui-nav-item"><a href="#" class="layui-icon layui-icon-shrink-right"></a></li> <li class="refresh layui-nav-item"><a href="#" class="layui-icon layui-icon-refresh-1"></a></li> </ul> <div id="control" class="layui-layout-control"></div> <ul class="layui-nav layui-layout-right"> <li class="layui-nav-item layui-hide-xs"><a href="#" class="fullScreen layui-icon layui-icon-screen-full"></a></li> <li class="layui-nav-item layui-hide-xs"><a href="http://www.pearadmin.cn" class="layui-icon layui-icon-website"></a></li> <li class="layui-nav-item layui-hide-xs" id="headerNotice"></li> <li class="layui-nav-item" lay-unselect=""> <a href="javascript:;"><img th:src="@{/PearAdmin/admin/images/avatar.jpg}" class="layui-nav-img">就眠儀式</a> <dl class="layui-nav-child"> <dd><a href="javascript:;" class="pearson">我的信息</a></dd> <dd><a href="javascript:;">安全配置</a></dd> <dd><a href="login.html">註銷登錄</a></dd> </dl> </li> <li class="setting layui-nav-item"><a href="#" class="layui-icon layui-icon-more-vertical"></a></li> </ul> </div> <div class="layui-side layui-bg-black"> <div class="layui-logo"> <img class="logo" th:src="@{/PearAdmin/admin/images/logo.png}" /> <span class="title">Plus Admin</span> </div> <div class="layui-side-scroll"> <div id="sideMenu"></div> </div> </div> <div class="layui-body"> <div id="content"></div> </div> </div> <!-- 移動端 遮蓋層 --> <div class="pear-cover"></div> <!-- 初始加載 動畫--> <div class="loader-main"> <div class="loader"></div> </div> <!-- 聊天組件 --> <div id="social" class="layui-hide-xs"></div> <!-- 移動端 的 收縮適配 --> <div class="collaspe pe-collaspe layui-hide-sm"> <i class="layui-icon layui-icon-shrink-right"></i> </div> <script th:src="@{/PearAdmin/component/layui/layui.js}" charset="utf-8"></script> <script> layui.use(['pearAdmin', 'jquery', 'pearSocial', 'layer'], function() { var pearAdmin = layui.pearAdmin; var $ = layui.jquery; var layer = layui.layer; var pearSocial = layui.pearSocial; var pearAuth = layui.pearAuth; var config = { keepLoad: 2000, // 主 頁 加 載 過 度 時 長 可爲 false muiltTab: true, // 是 否 開 啓 多 標 籤 頁 true 開啓 false 關閉 control: false, // 是 否 開 啓 多 系 統 菜 單 true 開啓 false 關閉 theme: "dark-theme", // 默 認 主 題 樣 式 dark-theme 默認主題 light-theme 亮主題 index: '/console/console1', // 默 認 加 載 主 頁,這裏須要該 data: 'PearAdmin/admin/data/menu.json', // 菜 單 數 據 加 載 地 址 select: '0', // 默 認 選 中 菜 單 項 notice: 'PearAdmin/admin/data/notice.json', // 消 息 列 表 數 據 auth: 'PearAdmin/admin/data/permission.json' // 前端權限限制,false 關閉該功能 }; var setting = { elem: 'social' } pearSocial.render(setting); pearAdmin.render(config); }) </script> </body> </html>
由於這裏默認的index界面是console1.html,因此console1.html裏的資源和json也要從新引入,這裏就不放出代碼了。
Pear自帶了一些json數據,這裏咱們先用他的,把路徑改爲本身項目的。新建一個HelloController,在裏面配置下路由
@Controller public class HelloController { @GetMapping(value = "/console/console1") @ApiOperation(value = "轉發console1請求") public String console1(){ return "console/console1"; } @GetMapping(value = "/system/organization") public String organization(){ return "system/organization"; } @GetMapping(value = "/system/user") public String user(){ return "system/user"; } @GetMapping(value = "/system/role") public String role(){ return "system/role"; } @GetMapping(value = "/system/power") public String power(){ return "system/power"; } @GetMapping(value = "/page/comment") public String comment(){ return "page/comment"; } }
咱們啓動項目,看一下效果
Pear的菜單是經過menu.json來動態生成的。以後的這個數據須要後端返回,可是我先用這個假數據。我把我修改過的menu.json貼上來,避免有些同窗頁面出不來。
[{ "id": 1, "title": "工做空間", "type": 0, "icon": "layui-icon layui-icon-console", "href": "", "children": [{ "id": 0, "title": "控制後臺", "icon": "layui-icon layui-icon-console", "type": 1, "openType": "_iframe", "href": "console/console1" }] }, { "id": 4, "title": "系統管理", "icon": "layui-icon layui-icon-set-fill", "type": 0, "href": "", "children": [{ "id": 44, "title": "部門管理", "icon": "layui-icon layui-icon-username", "type": 1, "openType": "_iframe", "href": "system/organization" },{ "id": 41, "title": "用戶管理", "icon": "layui-icon layui-icon-username", "type": 1, "openType": "_iframe", "href": "system/user" }, { "id": 42, "title": "角色管理", "icon": "layui-icon layui-icon-user", "type": 1, "openType": "_iframe", "href": "system/role" }, { "id": 43, "title": "權限管理", "icon": "layui-icon layui-icon-user", "type": 1, "openType": "_iframe", "href": "system/power" } ] }, { "id": 2, "title": "擴展組件", "icon": "layui-icon layui-icon-component", "type": 0, "href": "", "children": [ { "id": 22, "title": "進階組件", "icon": "layui-icon layui-icon-face-smile", "type": 0, "href": "view/common/message.html", "children": [ { "id": 225, "title": "卡片列表", "icon": "layui-icon layui-icon-face-smile", "type": 1, "openType": "_iframe", "href": "view/common/senior/card.html" }, { "id": 224, "title": "樹狀結構", "icon": "layui-icon layui-icon-face-smile", "type": 1, "openType": "_iframe", "href": "view/common/senior/dtree.html" } ] } ] }, { "id": 3, "title": "經常使用頁面", "icon": "layui-icon layui-icon-face-cry", "type": 0, "href": "", "children": [{ "id": 302, "title": "登陸頁面", "icon": "layui-icon layui-icon-face-smile", "type": 1, "openType": "_iframe", "href": "login" }, { "id": 303, "title": "留言板", "icon": "layui-icon layui-icon-face-smile", "type": 1, "openType": "_iframe", "href": "page/comment" } ] }, { "id": "error", "title": "錯誤頁面", "icon": "layui-icon layui-icon-auz", "type": 0, "href": "", "children": [{ "id": 403, "title": "403", "icon": "layui-icon layui-icon-face-smile", "type": 1, "openType": "_iframe", "href": "view/error/403.html" }, { "id": 404, "title": "404", "icon": "layui-icon layui-icon-face-cry", "type": 1, "openType": "_iframe", "href": "view/error/404.html" }, { "id": 500, "title": "500", "icon": "layui-icon layui-icon-face-cry", "type": 1, "openType": "_iframe", "href": "view/error/500.html" } ] } ]
將會涉及到的技術棧(待完善)
一、SpringBoot
二、SpringSecurity
三、MyBatis
四、Apache Log4j2
五、JWT
六、Druid
七、Swagger
八、Redis
九、Layui
十、Pear Admin Layui
等
以上源代碼同步在gitee和github中,若是能夠的話,請給我一個star,謝謝
Admin端 | |
---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
支付寶 | 微信 |
---|---|
![]() |
![]() |