源码获取: github或者gitee

文章目录

  • 系列目录
  • 前言
  • 一、简介
  • 二、什么是RBAC
  • 三、系统功能
  • 四、环境搭建
  • 五、技术栈
  • 六、说明
  • 七、项目截图
  • 八、请作者喝杯卡布奇诺

系列目录

SpringSecurity权限管理系统实战—一、项目简介和开发环境准备
SpringSecurity权限管理系统实战—二、日志、接口文档等实现
SpringSecurity权限管理系统实战—三、主要页面及接口实现
SpringSecurity权限管理系统实战—四、整合SpringSecurity(上)
SpringSecurity权限管理系统实战—五、整合SpringSecurity(下)
SpringSecurity权限管理系统实战—六、SpringSecurity整合JWT
SpringSecurity权限管理系统实战—七、处理一些问题
SpringSecurity权限管理系统实战—八、AOP 记录用户日志、异常日志
SpringSecurity权限管理系统实战—九、数据权限的配置

前言

博主的文笔有些差,大家多担待,在本篇文章结尾可看已完成的效果

一、简介

​ 在企业应用中,认证和授权是非常重要的一部分内容,业界最出名的两个框架就是大名鼎鼎的 Shiro和Spring Security。本次我选取的是和SpringBoot更好兼容的SpringSecurity。

二、什么是RBAC

​ RBAC是Role Based Access Control的缩写,是基于角色的访问控制。一般都是分为用户(user), 角色(role),权限(permission)三个实体,角色(role)和权限(permission)是多对多的 关系,用户(user)和角色(role)也是多对多的关系。用户(user)和权限(permission) 之间没有直接的关系,都是通过角色作为代理,才能获取到用户(user)拥有的权限。

​ 以下是RBAC0的模型

详细解释见

三、系统功能

  • 用户管理:提供用户的相关配置
  • 角色管理:对权限与菜单进行分配
  • 菜单管理:已实现菜单动态路由,后端可配置化,支持多级菜单
  • 字典管理:可维护常用一些固定的数据
  • 系统日志:记录用户操作日志与异常日志
  • SQL监控:采用druid 监控数据库访问性能
  • 代码生成:高灵活度生成前后端代码,减少大量重复的工作任务
  • 接口管理:方便统一查看管理接口

由于本系统是边开发写此文档的,所以可能上述的功能在后续的开发中会有删改。

四、环境搭建

本次系统非前后端分离项目,基于SpringBoot+Layui,后台模板选用的是Pear Admin Layui (我目前见过最漂亮的layui后台模板,放张图片让大家感受一下)

数据库设计

目前先这样,之后还会扩展。

在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, // 主 页 加 载 过 度 时 长 可为 falsemuiltTab: 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"}]}
]

五、技术栈

将会涉及到的技术栈(待完善)

1、SpringBoot

2、SpringSecurity

3、MyBatis

4、Apache Log4j2

5、JWT

6、Druid

7、Swagger

8、Redis

9、Layui

10、Pear Admin Layui

六、说明

以上源代码同步在github和gitee中,如果可以的话,请给我一个star,谢谢

七、项目截图

Admin端

八、请作者喝杯卡布奇诺

支付宝 微信

SpringSecurity权限管理系统实战—一、项目简介和开发环境准备相关推荐

  1. SpringSecurity权限管理系统实战—六、SpringSecurity整合JWT

    文章目录 系列目录 前言 一.无状态登录 二.JWT介绍 1.什么是jwt 头部(Header) 载荷(Payload) 签名(Signature) 2.JWT工作流程 3.简单实现 三.整合JWT ...

  2. 【kratos入门实战教程】1-kratos项目搭建和开发环境配置

    1.系列目录 [kratos入门实战教程]0-商城项目介绍 [kratos入门实战教程]1-kratos项目搭建和开发环境配置 [kratos入门实战教程]2-实现注册登陆业务 2.概览 经过上一篇的 ...

  3. 【菠萝狗四足机器人】二次开发教程--第一章 【简介与开发环境搭建】

    Py-apple Dynamics 简介与开发环境搭建 1 简介 1.1 何为 菠萝狗 和 Py-Apple Dynamics 1.2 目前支持的功能 2 开发环境搭建 2.1 硬件的搭建 2.1 软 ...

  4. java开发环境及数据类型实验_实验项目1 Java开发环境与语言基础

    <实验项目1 Java开发环境与语言基础>由会员分享,可在线阅读,更多相关<实验项目1 Java开发环境与语言基础(14页珍藏版)>请在人人文库网上搜索. 1.实验项目1 Ja ...

  5. java服务器要二次编译,ecology项目二次开发环境搭建

    ecology项目二次开发环境搭建 Submitted By Weaver 文档版本控制 文档简要信息: 文档主题(Title) ecology项目二次开发环境搭建 作者(Author) 审批者 (T ...

  6. 快速上手Flask(一) 认识框架Flask、项目结构、开发环境

    文章目录 快速上手Flask(一) 认识框架Flask.项目结构.开发环境 Web开发轻量级框架Flask Flash历史和团队 Pallets 项目 flask运行过程 使用flask的场景 使用P ...

  7. 前端基础 - HTML简介及开发环境

    前端基础 - HTML简介及开发环境 HTML简介及开发环境 HTML简介: 英文:Hyper Text Markup Language(超级文本标记语言) 超级文本:普通文本只能显示文字,超级文本, ...

  8. 51单片机学习笔记1 简介及开发环境

    51单片机学习笔记1 简介及开发环境 一.51单片机 1. STC89C52单片机简介 2. 命名规则 3. 封装 (1)PDIP (2)LQFP (3)PLCC (4)PQFP 二.STC8051结 ...

  9. 【SpringBoot项目实战+思维导图】瑞吉外卖①(项目介绍、开发环境搭建、后台登陆/退出功能开发)

    文章目录 软件开发整体介绍 软件开发流程 角色分工 软件环境 瑞吉外卖项目介绍 项目介绍 产品原型 技术选型 功能架构 角色 开发环境搭建 数据库环境搭建 创建数据库 数据库表导入 数据库表介绍 Ma ...

最新文章

  1. 简单的说一说java线程中的死锁和嵌套管程锁死问题?
  2. 如何在更大的div内使图像中心(垂直和水平)居中[重复]
  3. vue-router(2)
  4. faiss(1):简介 安装 与 原理
  5. C/Cpp / 模板类中可以使用虚函数吗?模板成员函数可以是虚函数吗?
  6. 实时计算 Flink 版应用场景解读
  7. JDBC 创建连接对象的三种方式 、 properties文件的建立、编辑和信息获取
  8. MySQL5.5读写分离之mysql-proxy
  9. Error:(1, 10) java: 需要class, interface或enum
  10. 程序员如何跟领导提离职_员工辞职不交接工作被领导怒怼:我不批离职,跟你耗着,结果蒙了...
  11. 关于普中科技程序烧录软件PZ-ISP与驱动安装程序SETUP.exe之间血与泪的教训
  12. ipad上写代码???阿里云+vscode-server助你一臂之力
  13. 用户/账户/账号的理解
  14. linux中wps默认安装目录,在Linux系统中安装使用WPS的方法
  15. 【原创】登录和注册页推荐 尊重原创 记得点赞
  16. 计算机考试的知识要记忆背,2017计算机等级考试(NCRE)备考小技巧
  17. 读取ntfs的usn
  18. 串行口数据缓冲寄存器 SBUF 之 初步了解
  19. 【C语言】冷知识——前置++和后置++
  20. [转]java中文乱码解决之道(三)-----编码详情:伟大的创想---Unicode编码

热门文章

  1. TCP,UDP创建服务器以及客户端
  2. 数字化能力成关键优势,《2022中国人力资源科技发展十大趋势发布》
  3. 有一种70年的情缘,叫中国科学院和海淀!
  4. matlab gamma拉伸,基于matlab的gamma校正
  5. 统计一个月每一天表中新增的数据量
  6. 中美印程序员“土味情话”哪家强?
  7. 量子计算机寄存器,科学家正在构建强大实用的离子阱量子计算机
  8. 使用git向远程厂库提交代码时rejcted错误
  9. FastReport打印时图片出现了黑边框
  10. 数据结构与算法分析(六)队列总结