松哥最近正在录制 TienChin 项目视频~采用 Spring Boot+Vue3 技术栈,里边会涉及到各种好玩的技术,小伙伴们来和松哥一起做一个完成率超 90% 的项目,戳戳戳这里-->TienChin 项目配套视频来啦。
松哥注:前后端分离的文章我之前也写过好几篇,也录过相关的视频,小伙伴们可以参考:SpringBoot+Vue 系列视频教程。最近在网上看到一篇讲前后端分离权限设计方案的文章,感觉还不错,和小伙伴们分享一下,原文地址:https://www.yuque.com/zhanghaofei/blog/xrpz9p
简述
近几年随着 react、angular、vue 等前端框架兴起,前后端分离的架构迅速流行。但同时权限控制也带来了问题。
场景
系统为后台管理系统,包含了用户创建、用户登录、用户管理自己的资源。用户经常会新增、删除,也可以根据工作情况随时调整页面、功能权限,所以采用用户-角色-页面权限方案实现。
为什么不行:
1. 根据前端路由表显示左侧菜单,但 vue-router 的路由表主要为了组织代码,经常我们所需要的菜单并非一致。比如某个前端路由 a 子路由有 b、c,但菜单中我们想要直接一级菜单就显示 b、c 或者将 b、c 各放到其他菜单下。所以这种非常不灵活。2. 一个路由是菜单还是页面?是否需要显示到菜单中?是否验证权限?哪个角色或者用户拥有权限?这些都需要写到前端路由里面,一旦有任何权限变动就要大量调整代码。3. 如果权限写死在前端,那么角色或者用户必须已知且固定不变。比如页面 1 的 meta 增加属性标识可访问的角色为 a 和 b
页面
一个页面即一个前端页面,比如首页、用户管理页、资源管理页等。
1. 前端路由(vue-router)中需要正常创建页面及路由。2. 数据库存储菜单结构和页面权限信息,
a. 菜单(目录、非内容页)可以自己创建,不必要求前端路由中有,因为这是指菜单的可视化的组织结构
b. 页面(内容页)必须是前端路由中已有页面,因为这是用户需要访问的内容。
e. 不需要控制权限且不需要显示到左侧菜单的路由这里可以不进行管理,比如 404 页面等
3. 前台打开后获取获取数据库的所有菜单、页面及结构,根据是否登录、是否需要验证权限等进行控制,或无权限跳转至登录页
5. 路由守卫中根据上一步获得的权限列表判断每个跳转,无权限可返回 404 或无权限页面,防止用户手动输入 path 越权访问
页面管理:

页面编辑:

功能
部分功能有事需要单独控制权限,比如用户管理页面可能允许多个角色查看,但是其中的“创建用户”功能只允许某一个角色使用,那么仅仅使用页面权限是不够。所以需要细粒度的功能权限控制。
所以更合理的方法应该为将每个功能单独进行控制并和页面进行关联,且不限定必须是增、删、改、查四种,可以任意定制,只需要与前后端开发约定一个唯一的标识即可。
页面功能管理:

获取用户拥有的权限:

角色
一个角色类似于一个身份或岗位,每个角色有自己的权限范围。
一个角色可以拥有多个页面权限。 一个角色可以拥有多个功能权限。
角色管理:

角色分配权限:

用户
用户可以创建、删除,一个用户随时可能变更工作内容,或者身兼数职,所以可以为其分配一个或者多个角色,他拥有的角色的权限就是他的权限。此时已经可以打通权限前端的权限分配,用户-角色-页面权限、功能权限。
用户管理:

用户分配角色:

前端效果
前端页面菜单效果:

后端权限
传统前后端不分离的情况下,路由都在后端统一管理,简单的方法比如用户管理页面 /user/ 那么他里面使用的接口都使用 /user/add、/user/delete 等相同前缀,那么只要判断用户拥有 /user/ 权限就可以访问/user/*
所有接口。
前后端分离后面临的问题:
接口
方案:1. 需要控制权限的接口进行上传管理(可以做成管理页面)2. 每个页面和功能可以关联多个接口,比如用户页面关联了用户查询接口和用户编辑接口,用户删除功能关联用户删除接口3. 后端对请求的路径进行判断,用户->角色->页面/功能->接口,拥有接口权限即允许访问4. 前后端分团队开发,不容易一一对照,且前端有自己的路由(此路由受限于代码组织结构)等等,无法使用传统方式简单处理5. 相同的接口可能会被前端多个页面多次利用
接口管理:

页面关联接口、功能关联接口:

请求的接口无权限时:

接口后端权限控制
后端控制其实很简单,只要前面管理功能做好即可,基本逻辑为:
1. 用户访问接口2. 判断用户和当前 path,根据用户->角色->页面/功能->接口 得到当前用户有权限的接口列表与当前path相比3. 若无权限(某些接口只需要登录就能访问的,比如获取用户姓名信息的需要排除在外)则直接返回失败,前端全局捕获后给出无权限提示
总结
b. 标记页面上下级结构、是否内容页(需对应前端存在的路由页面)、是否可见、是否控制权限等等
c. 前端菜单、面包屑等对用户可感知的内容根据此上下级结构等进行渲染,不必受限于前端代码中的路由
松哥最近正在录制 TienChin 项目视频~采用 Spring Boot+Vue3 技术栈,里边会涉及到各种好玩的技术,小伙伴们来和松哥一起做一个完成率超 90% 的项目,戳戳戳这里-->TienChin 项目配套视频来啦。





