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、请做者喝杯咖啡

支付宝 微信
相关文章
相关标签/搜索