Spring Cloud + Vue前后端分离-第12章 通用权限设计

 源代码在GitHub - 629y/course: Spring Cloud + Vue前后端分离-在线课程

Spring Cloud + Vue前后端分离-第12章 通用权限设计

这一章我们不依赖第三方框架,我会从权限相关表的设计,到权限的配置,到权限的拦截,带大家一步一步的做出一个通用的权限设计方案。

12-1 通用权限解决方案介绍

权限拦截的对象:用户

权限拦截的点:菜单、路由、接口、按钮

控制用户对资源的访问

权限的操作:配置、读取、拦截

100用户 * 100资源

直接用用户和资源做关联来控制权限,适合小型的项目,简单,快速

三个核心概念:用户、角色、资源

100用户 * 2个角色 + 2个角色 * 100资源

经典的权限管理设计:用户和角色关联,角色和资源关联

功能点:

配置:

        用户管理:用户表,用户管理界面,已完成

        资源配置:资源表,资源配置界面

        角色管理:角色表,角色管理界面

        用户角色关联配置:用户角色关联表,复用角色管理界面

        角色资源关联配置:角色资源关联表,复用角色管理界面

两张关联表的配置,可以单独设计界面,也可以直接做到角色管理界面里。

读取:

        用户权限的读取:用户登录的时候,读取该用户的所有权限。

登录时,通过用户角色关联表,可以知道当前登录用户的角色,再通过角色资源关联表就可以查到当前用户所有的资源

拦截:

        用户操作业务时,进行权限拦截

                前端界面:菜单,路由,按钮,hidden disabled

                后端接口:接口,gateway的过滤器

疑问:前端已经对菜单和按钮做拦截,用户不能操作了,为什么还要对接口做拦截?

重要提示:所有前端的设计都是不安全的。

例登录名被修改了,说明我们的接口没有做登录名不可修改的校验,因为我们认为给登录名加了disabled就可以了,这是一个常见的安全隐患。

权限初始化

系统上线时,要初始化这五张表的数据。初始有一个用户能登录,能管理角色,管理资源,分配权限。

前面的章节的讲解模式是从简单的功能入手,再不断的扩展和完善,这一章,我们换一种模式,就会先分析需求,再列出功能点,明确总体要做哪些功能,再开始开发。

在实际工作中,也是用这种模式,我们还会加入团队评审的环节,确保我们的功能不会做歪了。

中高级面试题:请简单的设计一个权限管理功能,对初级人员来说会有点难,不过学完这一章,就不是问题了。

12-2 资源配置管理

资源表的设计与基本代码生成

1.通用权限管理:资源表的设计与基本代码生成

资源的名称一般是用页面上看得见的元素:菜单、按钮等。

all.sql

如果一个页面的所有操作统一控制权限,request可以填相关接口的前缀

生成代码

ResourceService.java报错原因:资源表的实体类是Resource和@Resource注解同名,导致冲突 

admin.vue

router.js

测试

资源树的保存

1.通用权限管理:资源树的保存

资源点是开发阶段就确定的,所以并不是上线后再一个一个配置的。

资源管理最简单的一种方案:上线前准备好sql,刷库。

将资源管理做成资源树进行管理。

填入数据:带有层级结构的json字符串

resource.json

用法:以后开发新功能的时候,就在该文件里加入新的资源,可以上线前将新的资源json通过控台保存进数据库。

resource.vue

ResourceDto.java

ResourceService.java

将节点一个一个的取出来,放入list中 

ResourceController.java

测试

资源树的显示

1.通用权限管理:资源树的显示

resource.vue

ResourceController.java

ResourceService.java

资源的保存是将树结构转成列表,重点是children属性;资源的显示是将列表转成树结构,重点是parent属性。

小知识:一边循环list,一边删除list中的对象,可以使用倒序循环。

list中有父节点的对象都会被remove掉,最终留下来的就是顶级的节点。

测试

12-3 角色权限管理

基本的角色管理功能

1.通用权限管理:增加基本的角色管理功能

2.资源列表补全

all.sql

admin.vue

router.js

resource.json

[{"id" : "01","name": "系统管理","children": [{"id" : "0101","name": "用户管理","page": "/system/user","children": [{"id": "010101","name": "保存","request": ["/system/admin/user/list","/system/admin/user/save"]},{"id": "010102","name": "删除","request": ["/system/admin/user/delete"]},{"id": "010103","name": "重置密码","request": ["/system/admin/user/save-password"]}]},{"id" : "0102","name": "资源管理","page": "/system/resource","children": [{"id": "010201","name": "保存/显示","request": ["/system/admin/resource"]}]},{"id" : "0103","name": "角色管理","page": "/system/role","children": [{"id": "010301","name": "角色/权限管理","request": ["/system/admin/role"]}]}]
},{"id" : "02","name": "业务管理","children": [{"id" : "0201","name": "分类管理","page": "business/category","children": [{"id": "020101","name": "增删改查","request": ["/business/admin/category"]}]},{"id" : "0202","name": "课程管理","page": "business/course","children": [{"id": "020201","name": "增删改查","request": ["/business/admin/course","/business/admin/category/all,/business/admin/teacher/list","/file/f/course","/business/chapter"]}]},{"id" : "0203","name": "讲师管理","page": "business/teacher","children": [{"id": "020301","name": "增删改查","request": ["/business/admin/teacher"]}]}, {"id" : "0204","name": "大章管理","page": "business/chapter","children": [{"id": "020401","name": "增删改查","request": ["/business/admin/course","/business/admin/chapter"]}]},{"id" : "0205","name": "小节管理","page": "business/section","children": [{"id": "020501","name": "增删改查","request": ["/business/admin/section","/business/admin/chapter"]}]}]},{"id" : "03","name": "文件管理","children": [{"id" : "0301","name": "文件管理","page": "file/file","children": [{"id": "030101","name": "文件管理","request": ["/file/admin/file","/file/admin"]}]}]}
]

测试

增加角色资源关联功能

1.通用权限管理:增加角色资源关联功能表,生成持久层和服务端代码

all.sql

点击[关联资源]按钮时,加载资源树

1.通用权限管理:点击[关联资源]按钮时,加载资源树

role.vue

测试

点击资源树模态框【保存】按钮时,保存角色资源关联表

1.通用权限管理:点击资源树模态框【保存】按钮时,保存角色资源关联表

role.vue

RoleDto.java

RoleService.java

RoleController.java

测试

打开资源树模态框时,加载角色资源关联数据,并自动勾选树节点

1.通用权限管理:打开资源树模态框时,加载角色资源关联数据,并自动勾选树节点

role.vue

批量操作的思路:先将原有的删除,再批量新增

RoleService.java

RoleController.java

 测试

增加角色用户关联功能

1.通用权限管理:增加角色用户关联表,生成持久层和服务端代码

all.sql

点击【关联用户】按钮时,加载所有用户,弹出角色用户关联模态框

1.通用权限管理:点击【关联用户】按钮时,加载所有用户,弹出角色用户关联模态框

role.vue

测试

点击用户模态框【保存】按钮时,保存角色用户关联表

1.通用权限管理:点击用户模态框【保存】按钮时,保存角色用户关联表

role.vue

依赖vue的双向数据绑定特性,可以将复杂的页面操作变成简单的数据操作。很多前端框架都有双向数据绑定的特性,比如angular,微信小程序等。

RoleDto.java

RoleService.java

RoleController.java

测试

打开用户模态框时,加载角色用户关联数据

1.通用权限管理:打开用户模态框时,加载角色用户关联数据

role.vue

 查关联表,得到的时userId,但是显示需要的是loginName。这里也可以通过写自定义mapper,把user表和role_user表关联得到loginName

RoleService.java

RoleController.java

测试

12-4 登录时获取资源权限

读取当前登录用户所属的角色的所有资源

1.通用权限管理:登录时,读取当前登录用户所属的角色的所有资源

LoginUserDto.java

一个资源可以会用到多个接口,多个资源的接口就可能重复,所以这里用Set去重

MyUserMapper.xml

MyUserMapper.java

UserService.java

 测试

00000000

00000001 

00000002

 关于User的权限设置比较细,每个请求接口都可以单独控制。关于Resource的权限设置比较粗,所有接口用同一个request控制

12-5 权限拦截功能开发

前端界面权限拦截

前端界面权限拦截,完成用户管理

1.通用权限管理:前端界面权限拦截,完成用户管理

tool.js

admin.vue

在html中要使用vue方法,这个方法得在methods中定义

user.vue

测试

目前只修改了用户管理的权限拦截,以用户管理为例

00000000

每次修改权限配置,需要重新登录后才生效

前端界面权限拦截,完成所有界面控制

1.通用权限管理:前端界面权限拦截,完成所有界面控制

admin.vue

如果一个页面的所有按钮是统一控制的,那么只需要控制菜单就可以了,不需要给每个按钮加权限控制代码。

测试

路由权限判断

1.通用权限管理:前端界面权限拦截,增加路由权限判断

没有资源管理,但是我们可以直接通过路由进入

resource.json

[{"id" : "00","name": "欢迎","page": "welcome"
},{"id" : "01","name": "系统管理","children": [{"id" : "0101","name": "用户管理","page": "system/user","children": [{"id": "010101","name": "保存","request": ["/system/admin/user/list","/system/admin/user/save"]},{"id": "010102","name": "删除","request": ["/system/admin/user/delete"]},{"id": "010103","name": "重置密码","request": ["/system/admin/user/save-password"]}]},{"id" : "0102","name": "资源管理","page": "system/resource","children": [{"id": "010201","name": "保存/显示","request": ["/system/admin/resource"]}]},{"id" : "0103","name": "角色管理","page": "system/role","children": [{"id": "010301","name": "角色/权限管理","request": ["system/admin/role"]}]}]
},{"id" : "02","name": "业务管理","children": [{"id" : "0201","name": "分类管理","page": "business/category","children": [{"id": "020101","name": "增删改查","request": ["/business/admin/category"]}]},{"id" : "0202","name": "课程管理","page": "business/course","children": [{"id": "020201","name": "增删改查","request": ["/business/admin/course","/business/admin/category/all,/business/admin/teacher/list","/file/f/course","/business/chapter"]}]},{"id" : "0203","name": "讲师管理","page": "business/teacher","children": [{"id": "020301","name": "增删改查","request": ["/business/admin/teacher"]}]}, {"id" : "0204","name": "大章管理","page": "business/chapter","children": [{"id": "020401","name": "增删改查","request": ["/business/admin/course","/business/admin/chapter"]}]},{"id" : "0205","name": "小节管理","page": "business/section","children": [{"id": "020501","name": "增删改查","request": ["/business/admin/section","/business/admin/chapter"]}]}]},{"id" : "03","name": "文件管理","children": [{"id" : "0301","name": "文件管理","page": "file/file","children": [{"id": "030101","name": "文件管理","request": ["/file/admin/file","/file/admin"]}]}]}
]

 admin.vue

第一次加载admin.vue时,需要判断路由权限,比如从登录页跳到控台主页,或者刷新控台主页时,会执行mounted.

进入控台主页后,发生子路由跳转时,会触发watch。

测试

后端接口权限判断

1.通用权限管理:增加后端接口权限拦截

在做登录功能时,我们也对接口做了登录校验,否则容易被绕开登录,直接调用后端接口。这里同样需要对接口做权限拦截

重新登录 

可以通过搜索hidden,display:none等,来查看页面是否有隐藏元素

ctrl+f

 可以删除成功,这是非常危险的

 LoginAdminGatewayFilter.java

gateway里没有饮用server模块,所以没用LoginUserDto类。这里转成JSONObject进行操作

比如资源的保存:

path=system/admin/resource/save,

而配置的

request=system/admin/resource,

那么path.contain(request)就是true

测试

可以在vue的拦截器中,针对401返回码做判断,如果是401,就跳到登录页面

将业务场景变成程序代码

需求分析:最终要做成什么样子,如何使用这个功能。

功能点拆分:要实现这个需求,都有哪些功能点。

代码编写

团队内部评审通过后,为每个功能点评优先级,并估工时。

每天早上开展例会,每个人花几分钟的时间回答3个问题:

1.昨天做了哪些内容;

2.有没有遇到什么问题;

3.今天准备做哪些内容。

有问题一定要反馈出来,可以是遇到新技术了,或是功能点比想象中复杂,工时估少了等等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/617751.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第十六天 | 110. 平衡二叉树、257. 二叉树的所有路径、404.左叶子之和

题目链接:leetcode 110. 平衡二叉树 文章讲解:代码随想录 110. 平衡二叉树讲解 视频讲解:后序遍历求高度,高度判断是否平衡 | LeetCode:110.平衡二叉树 思路和解法 题目: 给定一个二叉树,判…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑新能源配网三相不平衡治理的电动汽车充电策略》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 这个标题表明研究着重于开发一种电动汽车充电策略,该策略考虑了在新能源配电网络中存在的三相不平衡问题。解读如下: 电动汽车充…

Typora上传图片失败PicGo

起初我是在Typora中点击一键上传图片,结果如下,报错。可是我找了半天也没错啊。 最后发现原来是一个图片的命名问题,名字太过于复杂,PicGo识别不出,一个图片报错导致其它也上传不了。 我把它复制到其它文件夹之后&…

【QUARTZ】springboot+quartz动态配置定时任务

Quartz 介绍 Quartz 定时任务可分为Trigger(触发器)、Job(任务)和Scheduler(调度器),定时任务的逻辑大体为:创建触发器和任务,并将其加入到调度器中,如下图所…

webpack原理和逆向实战

文章目录 什么是webpackwebpack基本原理webpack代码分析webpack代码抠取webpack全模块自吐webpack自动扣取总结 什么是webpack webpack是一个现代 JavaScript 应用程序的静态模块打包器(module bundler),负责分析翻译压缩打包代码。 上面的官网的一张示例图。 web…

大数据实时抓取软件:Maxwell学习网站的高效框架!

介绍:Maxwell是由美国Zendesk开源的,使用Java编写的MySQL实时抓取软件。它能够实时读取MySQL的二进制日志(Binlog),并将这些信息生成为JSON格式的消息。进一步地,Maxwell将这些消息作为生产者发送给Kafka、…

Springboot项目Nacos做配置中心

Springboot项目Nacos做配置中心 说明安装2.Springboot整合使用Nacos3.问题处理 说明 文档参考 Nacos Spring Boot 安装 查看nacos镜像 docker search nacos 下载镜像 docker pull nacos/nacos-server启动naocs镜像 docker run --env MODEstandalone --name nacos -d -p 8…

Abaqus2023安装下载教程

用钢铁意志,成就不平凡的人生。 今天博主整理了一下Abaqus2023安装下载教程,希望大家学习。 安装之前请关闭电脑所有杀毒软件和防火墙,并保证计算机名不是中文!!!! 1.首先创建一个用于Abaqus…

MySQL夯实之路-MVCC机制深入浅出

多版本并发控制(MVCC,multiversion concurrency control) MVCC用更加灵活的方式处理并发,实现了读不加锁,读写不冲突。保证了事务的隔离性(可重复读),避免了不可重复读问题。 数据…

go中拷贝文件操作

一. 拷贝文件内容到另一个文件位置 // 拷贝文件内容到另一个文件里面 func copyContent() {filepath1 : "d:/abc.txt"filepath2 : "e:/eee.txt"// 读取内容data, err : os.ReadFile(filepath1) // 使用os.ReadFile函数读取指定路径的文件内容if err ! nil…

MyBatis面试题及高级用法

问题1: 请介绍一下MyBatis,以及它的主要特点是什么? 答案1: MyBatis是一个Java持久层框架,通过将SQL语句映射到对象,简化了数据库访问。它的主要特点包括动态SQL生成、自动参数映射和复杂映射支持。 问题2: MyBatis和其他ORM框架…

HTML常用标签

基本 <html>…</html> 定义 HTML 文档 <head>…</head> 文档的信息 <meta> HTML 文档的元信息 <title>…</title> 文档的标题 <link> 文档与外部资源的关系 <styl…

【Linux】进程程序替换

👑作者主页:@安 度 因 🏠学习社区:安度因 📖专栏链接:Linux 文章目录 简单看看程序替换原理(单进程)多进程进程程序替换补充exec 系列进程创建时有两个目标: 执行父进程的部分代码,由自己编写的,通过 if else 分流,让子进程执行的对应任务。执行和父进程完全不同…

Linux上如何一键安装软件?yum源是什么?Linux如何配置yum源?

这几个问题是Linux操作的入门问题&#xff0c;但是确实也会让刚上手Linux小伙伴头疼一阵&#xff0c;故特有此文&#xff0c;希望能对刚入门的小伙伴有一些帮助~ 众所周知 在linux上在线安装软件需要用到yum命令&#xff0c;经常下述命令来安装 yum install [-y] 包名 #-y的…

Hive基础知识(十二):Hive的基本查询

1. 全表和特定列查询 0&#xff09;数据准备 原始数据 dept: 10 ACCOUNTING 1700 20 RESEARCH 1800 30 SALES 1900 40 OPERATIONS 1700 emp&#xff1a; 7369 SMITH CLERK 7902 1980-12-17 800.00 20 7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30 7521 WARD SALESM…

解决POI报错POIXMLTypeLoader不存在的问题

问题&#xff1a; springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: org/apache/poi/POIXMLTypeLoaderat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet…

Flyio封装API接口(uniapp开发微信小程序)

Flyio封装API接口 1&#xff09;flyio 是什么? 2&#xff09;flyio能干什么&#xff1f; 3&#xff09;flyio使用 1&#xff09;flyio 是什么? 一个支持所有JavaScript运行环境的基于Promise的、支持请求转发、强大的http请求库。可以让您在多个端上尽可能大限度的实现代码…

数据结构与算法教程,数据结构C语言版教程!(第三部分、栈(Stack)和队列(Queue)详解)五

第三部分、栈(Stack)和队列(Queue)详解 栈和队列&#xff0c;严格意义上来说&#xff0c;也属于线性表&#xff0c;因为它们也都用于存储逻辑关系为 "一对一" 的数据&#xff0c;但由于它们比较特殊&#xff0c;因此将其单独作为一章&#xff0c;做重点讲解。 使用栈…

Java Swing 图书借阅系统 窗体项目 期末课程设计 窗体设计

视频教程&#xff1a; 【课程设计】图书借阅系统 功能描述&#xff1a; 图书管理系统有三个角色&#xff0c;系统管理员、图书管理员、借阅者&#xff1b; 系统管理员可以添加借阅用户&#xff1b; ​图书管理员可以添加图书&#xff0c;操作图书借阅和归还&#xff1b; 借…

c++例题2点和直线关系

#include<iostream> #include<string> using namespace std; //圆的类 class yuan{ public:int x2 10;int y2 10;int r 5; }; //点的类 class dian{ public :void setx(int x){x1 x;}int getx(){return x1;}void sety(int y){y1 y;}int gety(){return y1;} pr…