SpringSecurity權限管理系統實戰—1、項目簡介和開發環境準備

目錄

SpringSecurity權限管理系統實戰—1、項目簡介和開發環境準備
SpringSecurity權限管理系統實戰—2、日誌、接口文檔等實現
SpringSecurity權限管理系統實戰—3、主要頁面及接口實現
SpringSecurity權限管理系統實戰—4、整合SpringSecurity(上)
SpringSecurity權限管理系統實戰—5、整合SpringSecurity(下)
SpringSecurity權限管理系統實戰—6、SpringSecurity整合jwt
SpringSecurity權限管理系統實戰—7、處理一些問題
SpringSecurity權限管理系統實戰—8、AOP 記錄用戶日誌、異常日誌javascript

前言

博主的文筆有些差,你們多擔待css

1、簡介

​ 在企業應用中,認證和受權是很是重要的一部份內容,業界最出名的兩個框架就是大名鼎鼎的 Shiro和Spring Security。本次我選取的是和SpringBoot更好兼容的SpringSecurity。html

2、什麼是RBAC

​ RBAC是Role Based Access Control的縮寫,是基於角色的訪問控制。通常都是分爲用戶(user), 角色(role),權限(permission)三個實體,角色(role)和權限(permission)是多對多的 關係,用戶(user)和角色(role)也是多對多的關係。用戶(user)和權限(permission) 之間沒有直接的關係,都是經過角色做爲代理,才能獲取到用戶(user)擁有的權限。前端

​ 如下是RBAC0的模型java

在這裏插入圖片描述

詳細解釋見mysql

3、系統功能

  • 用戶管理:提供用戶的相關配置
  • 角色管理:對權限與菜單進行分配
  • 菜單管理:已實現菜單動態路由,後端可配置化,支持多級菜單
  • 字典管理:可維護經常使用一些固定的數據
  • 系統日誌:記錄用戶操做日誌與異常日誌
  • SQL監控:採用druid 監控數據庫訪問性能
  • 代碼生成:高靈活度生成先後端代碼,減小大量重複的工做任務
  • 接口管理:方便統一查看管理接口

因爲本系統是邊開發寫此文檔的,因此可能上述的功能在後續的開發中會有刪改。jquery

4、環境搭建

本次系統非先後端分離項目,基於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"
			}

		]
	}
]

5、技術棧

將會涉及到的技術棧(待完善)

一、SpringBoot

二、SpringSecurity

三、MyBatis

四、Apache Log4j2

五、JWT

六、Druid

七、Swagger

八、Redis

九、Layui

十、Pear Admin Layui

6、說明

以上源代碼同步在giteegithub中,若是能夠的話,請給我一個star,謝謝

7、項目截圖

Admin端
image text 在這裏插入圖片描述
在這裏插入圖片描述 在這裏插入圖片描述
在這裏插入圖片描述 在這裏插入圖片描述
在這裏插入圖片描述 在這裏插入圖片描述
在這裏插入圖片描述 在這裏插入圖片描述
在這裏插入圖片描述 在這裏插入圖片描述
在這裏插入圖片描述 在這裏插入圖片描述

8、請做者喝杯咖啡

支付寶 微信
相關文章
相關標籤/搜索