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

news2024/11/6 7:30:58

 源代码在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.coloradmin.cn/o/1378426.html

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

相关文章

C语言基础语法跟练 day3

31、不使用累计乘法的基础上&#xff0c;通过移位运算&#xff08;<<&#xff09;实现2的n次方的计算。 #include <stdio.h> int main() {int i 0;scanf("%d",&i);printf("%d",1<<i);return 0; } 32、问题&#xff1a;一年约有 3.…

使用postman做接口测试(一)

如何执行HTTP接口测试。包括如下三步&#xff1a; 构造一条符合要求的HTTP请求消息&#xff1b;发给我&#xff0c;我给你回响应&#xff1b;你读取HTTP响应&#xff0c;检查响应内容是否正确。 今天我们就讲&#xff0c;如何使用postman发送符合要求的HTTP请求。 how-如何安…

完整的模型验证套路

读取图片 from PIL import Imageimg_path "../Yennefer_of_Vengerberg.jpg" image Image.open(img_path) print(image)转换成灰度图&#xff08;可选&#xff09; image image.convert(L) image.show()转换成RGB格式 image image.convert(RGB)因为png格式是四…

逆向分析爬取网页动态

本例子以爬取人民邮电出版社网页新书的信息为例 由于页面是动态的&#xff0c;信息会不停地更新&#xff0c;所以不同时间的爬取结果会不同。

Redis重点总结补充

Redis重点总结 1.redis分布式锁 2.redission实现分布式锁 注意&#xff1a;加锁、设置过期时间等操作都是基于lua脚本完成. redisson分布式锁&#xff0c;实现可重入&#xff08;前提是同一个线程下 3.redis主从集群 实现主从复制 ( Master-slave Replication)的工作原理 : …

Linux中关于echo命令详解

echo的作用 echo用于输出字符或字符串或者回显。 echo的参数说明 -n不换行输出内容-e解析转义字符-E不使用解析转义字符 使用 "-e" 参数拓展参数 \b删除前一个字符\c最后不加上换行号\f换页\n换行并将光标移动到行首\r光标移动到行首切不换行,如果\r后面还有字符,…

51-10 多模态论文串讲—ALBEF 论文精读

今天我们就来过一下多模态的串讲&#xff0c;其实之前&#xff0c;我们也讲了很多工作了&#xff0c;比如说CLIP&#xff0c;还有ViLT&#xff0c;以及CLIP的那么多后续工作。多模态学习在最近几年真的是异常的火爆&#xff0c;那除了普通的这种多模态学习&#xff0c;比如说视…

分块矩阵的定义、计算

目录 一、定义 二、分块矩阵的加减乘法 三、考点 一、定义 分块&#xff0c;顾名思义&#xff0c;将整个矩阵分成几部分&#xff0c;如下图所示 二、分块矩阵的加减乘法 三、考点 分块矩阵的考点不多&#xff0c;一般来说&#xff0c;有一种&#xff1a; 求分块矩阵的转置…

基于 IDEA 创建 Maven 的 Java SE 工程和 Java Web 工程

一、概念简介 Maven 工程相对之前的项目&#xff0c;多出一组 gavp 属性&#xff0c;gav 需要我们在创建项目的时候指定&#xff0c;p 有默认值&#xff0c;我们先行了解下这组属性的含义。 Maven 中的 GAVP 是指 GroupId、ArtifactId、Version、Packaging 等四个属性的缩写&am…

MFC为对话框资源添加类

VC6新建一个对话框类型的工程; 建立之后资源中默认有2个对话框,一个是主对话框,About这个是默认建立的关于版权信息的; 然后主对话框有对应的.h和.cpp文件;可以在其中进行编程; 默认建立的有一个 关于 对话框; 在资源中新插入一个对话框,IDD_DIALOG1是对话框ID; 新加…

数据库悲观锁 select for update的详解

一 作用 1.1 结论 在mysql中&#xff0c;select ... for update 仅适用于InnoDB&#xff0c;且必须在事务块中才能生效。Innodb引擎默认是行锁。 Select .... from where .... for update 如果在where的查询条件字段使用了【主键|索引】&#xff0c;则此命令上行锁。否…

典型场景解析|PolarDB分布式版如何支撑SaaS多租户?

SaaS多租户背景 很多平台类应用或系统&#xff08;如电商CRM平台、仓库订单平台等等&#xff09;&#xff0c;它们的服务模型是围绕用户维度&#xff08;这里的用户维度可以是一个卖家或品牌&#xff0c;可以是一个仓库等&#xff09;展开的。因此&#xff0c;这类型的平台业务…

Pandas十大练习题,掌握常用方法

文章目录 Pandas分析练习题1. 获取并了解数据2. 数据过滤与排序3. 数据分组4. Apply函数5. 合并数据6. 数据统计7. 数据可视化8. 创建数据框9. 时间序列10. 删除数据 代码均在Jupter Notebook上完成 Pandas分析练习题 数据集可从此获取&#xff1a; 链接: https://pan.baidu.co…

开源知识库工具推荐:低成本搭建知识库

在信息爆炸的时代&#xff0c;企业和个体对知识的存储和管理需求日益增强。开源知识库工具因其开源、免费、高效的特性&#xff0c;成为了众多组织和个人的首选。如果你正在寻找一款优秀的开源知识库工具&#xff0c;本文将为你推荐三款性能优异的产品&#xff0c;感兴趣就往下…

2024云服务器租用推荐,全网TOP10等你选!

云服务器哪家便宜&#xff1f;2024最新整理你要的都在这&#xff01;头部云厂商阿里云、腾讯云、华为云、京东云、UCloud等都在降价&#xff0c;阿腾云atengyun.com分享2024年云服务器租用价格给你惊喜&#xff01; 便宜云服务器阿里云腾讯云华为云 2024年便宜云服务器汇总&…

centos 7.6 忘记root密码 怎么重置root密码

centos 7.6 忘记root密码 怎么重置root密码 1、 问题描述2、解决方法 1、 问题描述 centos 7.6 忘记root密码&#xff0c;登录不了root用户 2、解决方法 启动系统进入grub界面&#xff0c;按e进入编辑模式&#xff0c;找到含有quiet的这行。在这行最后 添加 rw init/bin/ba…

深入理解 Flink(八)Flink Task 部署初始化和启动详解

JobMaster 部署 Task 核心入口&#xff1a; JobMaster.onStart();部署 Task 链条&#xff1a;JobMaster --> DefaultScheduler --> SchedulingStrategy --> ExecutionVertex --> Execution --> RPC请求 --> TaskExecutor TaskExecutor 处理 JobMaster 的 …

Linux系统——DNS解析详解

目录 一、DNS域名解析 1.DNS的作用 2.域名的组成 2.1域名层级结构关系特点 2.2域名空间构成 2.3域名的四种不同类型 2.3.1延伸 2.3.2总结 3.DNS域名解析过程 3.1递归查询 3.2迭代查询 3.3一次DNS解析的过程 4.DNS系统类型 4.1缓存域名服务器 4.2主域名服务器 4…

PaddleSeg的训练与测试推理全流程(超级详细)

LeNet模型量化 参考文档一.下载项目地址&#xff1a;https://gitee.com/paddlepaddle/PaddleSeg/tree/release%2F2.5/特别注意下载版本&#xff1a; 二.paddlepaddle-gpu安装1.环境安装参考文档&#xff1a;https://gitee.com/paddlepaddle/PaddleSeg/blob/release/2.8/docs/in…

HCIP OSPF实验

任务&#xff1a; 1.使用三种解决ospf不规则区域的方法 2.路由器5、6、7、8、15使用mgre 3.使用各种优化 4.全网可达 5.保证更新安全 6.使用地址为172.16.0.0/16合理划分 7.每个路由器都有环回 拓扑图&IP划分如下&#xff1a; 第一步&#xff0c;配置IP&环回地址…