近几年随着react、angular、vue等前端框架兴起,前后端分离的架构迅速流行。但同时权限控制也带来了问题。网上很多前、后端分离权限仅仅都仅仅在描述前端权限控制、且是较简单、固定的角色场景,满足不了我们用户、角色都是动态的场景。且仅仅前端进行权限控制并不是真正意义的权限控制,它只是减少页面结构暴露、增强用户体验的功效。场景

系统为后台管理系统,包含了用户创建、用户登录、用户管理自己的资源。用户经常会新增、删除,也可以根据工作情况随时调整页面、功能权限,所以采用用户-角色-页面权限方案实现。

为什么不行:

  1. 根据前端路由表显示左侧菜单,但vue-router的路由表主要为了组织代码,经常我们所需要的菜单并非一致。比如某个前端路由a子路由有b、c,但菜单中我们想要直接一级菜单就显示b、c或者将b、c各放到其他菜单下。所以这种非常不灵活。

  2. 一个路由是菜单还是页面?是否需要显示到菜单中?是否验证权限?哪个角色或者用户拥有权限?这些都需要写到前端路由里面,一旦有任何权限变动就要大量调整代码。

  3. 如果权限写死在前端,那么角色或者用户必须已知且固定不变。比如页面1的meta增加属性标识可访问的角色为a和b

页面

一个页面即一个前端页面,比如首页、用户管理页、资源管理页等。

基本思路为:前端路由保持不变,数据库存储菜单结构、页面权限控制(可以直接做成一个页面来方便管理)等,前端根据数据库中的菜单结构和权限信息来渲染一个菜单出来并只显示其有权限的菜单,并在路由守卫中进行权限控制防止手动输入path越权打开页面。

  1. 前端路由(vue-router)中需要正常创建页面及路由。
  2. 数据库存储菜单结构和页面权限信息,
    1. 菜单(目录、非内容页)可以自己创建,不必要求前端路由中有,因为这是指菜单的可视化的组织结构
    2. 页面(内容页)必须是前端路由中已有页面,因为这是用户需要访问的内容。
    3. 菜单和页面组成上下级关系,一级可以是菜单也可以是内容页,内容页也可以放在菜单下,这样理论(需要页面菜单样式支持)可以组成无限级菜单
    4. 菜单和页面的基本属性包括title(对应路由title)、name(对应路由name)、path(对应路由path)、父级、类型(菜单/页面)、是否可见(左侧菜单栏是否显示:部分页面可能是页面内的链接进去)、是否需要验证权限(部分页面比如首页无需验证权限大家都可以进入)
    5. 不需要控制权限且不需要显示到左侧菜单的路由这里可以不进行管理,比如404页面等
  1. 前台打开后获取获取数据库的所有菜单、页面及结构,根据是否登录、是否需要验证权限等进行控制,或无权限跳转至登录页
  2. 用户登录成功后,再获取用户对应的的页面权限列表,使用上一步获得的所有页面、结构和用户拥有权限的列表渲染出一个菜单,只包含此用户拥有权限的,提升用户体检,避免显示大量用户不能访问的菜单影响使用和不必要的功能暴露。
  3. 路由守卫中根据上一步获得的权限列表判断每个跳转,无权限可返回404或无权限页面,防止用户手动输入path越权访问

页面管理:功能

部分功能有事需要单独控制权限,比如用户管理页面可能允许多个角色查看,但是其中的“创建用户”功能只允许某一个角色使用,那么仅仅使用页面权限是不够。所以需要细粒度的功能权限控制。

网上的方案都是说:根据资源控制增、删、改、查等等,比如针对用户就是用户的创建、修改、删除、查询等。但是在我的实际使用中发现并不切合实际,最起码对像我这种管理后台,资源并不单纯的增删改查,可能有其他地方的其他操作中也会对此用户资源造成影响,比如禁用、删除角色也要禁用、删除用户,那么这个权限到底属于角色的权限还是属于用户的权限,或者后台又改了,角色又影响了其他资源或者不再对用户进行操作,都会影响权限控制。所以更合理的方法应该为将每个功能单独进行控制并和页面进行关联,且不限定必须是增、删、改、查四种,可以任意定制,只需要与前后端开发约定一个唯一的标识即可。如上的例子中,用户管理页面下有用户各种功能,角色管理页面中也有个角色禁用、删除功能,可以分别定义标识为role_disable、role_delete,如果拥有role_delete权限即可,即使没有user_delete权限,也可以直接删除用户,否则就不要给其role_delete权限。用户登录后,从数据库获取其所拥有的的权限列表并存入vuex,包含页面和功能对应关系,例如页面name为user:{user: ['user_delete', 'user_query']},页面中根据删除按钮可以v-if="hasPermission('user_delete')"判断即可。页面功能管理:

获取用户拥有的权限:

角色一个角色类似于一个身份或岗位,每个角色有自己的权限范围。

  1. 一个角色可以拥有多个页面权限。

  2. 一个角色可以拥有多个功能权限。

角色管理:角色分配权限:用户用户可以创建、删除,一个用户随时可能变更工作内容,或者身兼数职,所以可以为其分配一个或者多个角色,他拥有的角色的权限就是他的权限。此时已经可以打通权限前端的权限分配,用户-角色-页面权限、功能权限。用户管理:用户分配角色:前端效果前端页面菜单效果:后端权限传统前后端不分离的情况下,路由都在后端统一管理,简单的方法比如用户管理页面/user/那么他里面使用的接口都使用/user/add、/user/delete等相同前缀,那么只要判断用户拥有/user/权限就可以访问/user/*所有接口。前后端分离后面临的问题:接口

方案:

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

来源:www.yuque.com/zhanghaofei/blog/xrpz9p

公众号后台回复【2T】有惊喜礼包!

猜你喜欢

1、GitHub 标星 3.2w!史上最全技术人员面试手册!FackBoo发起和总结

2、如何才能成为优秀的架构师?

3、从零开始搭建创业公司后台技术栈

4、程序员一般可以从什么平台接私活?

5、37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...

6、滴滴业务中台构建实践,首次曝光

7、不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事

8、15张图看懂瞎忙和高效的区别!

你需要来自trustedinstaller的权限才能删除_前后端分离后的权限控制设计方案相关推荐

  1. springboot前后端分离后权限原理浅谈

    1. 需求描述 最近在梳理springboot前后端分离后的权限管理问题.前段时间,已经把shiro的实现和spring security 的实现进行了初步的了解.如果深入细节,一个篇幅怕是不够.本文 ...

  2. SpringBoot+SpringSecurity前后端分离+Jwt的权限认证(改造记录)

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/zzzgd_666/article/details/96444829 前言 一般来说,我们用Spr ...

  3. Spring Boot + Vue 前后端分离开发,权限管理的一点思路

    在传统的前后端不分的开发中,权限管理主要通过过滤器或者拦截器来进行(权限管理框架本身也是通过过滤器来实现功能),如果用户不具备某一个角色或者某一个权限,则无法访问某一个页面. 但是在前后端分离中,页面 ...

  4. 前后端分离中的权限管理思路

    在传统的前后端不分的开发中,权限管理主要通过过滤器或者拦截器来进行(权限管理框架本身也是通过过滤器来实现功能),如果用户不具备某一个角色或者某一个权限,则无法访问某一个页面. 但是在前后端分离中,页面 ...

  5. SpringBoot+SpringSecurity前后端分离+Jwt的权限认证改造记录!

    大家好,我是宝哥! 前言 一般来说,我们用SpringSecurity默认的话是前后端整在一起的,比如thymeleaf或者Freemarker,SpringSecurity还自带login登录页,还 ...

  6. SpringBoot+SpringSecurity前后端分离+Jwt的权限认证

    前言 一般来说,我们用SpringSecurity默认的话是前后端整在一起的,比如thymeleaf或者Freemarker,SpringSecurity还自带login登录页,还让你配置登出页,错误 ...

  7. 你需要administrators提供的权限才能删除_终于解决了:你需要来自XXX的权限才能对此文件进行更改

    不知道大家遇到过下图这种问题没有: 就是你删除文件的时候,提示你需要来自XXX的权限才能对此文件(夹)进行更改 总之阿虚是遇到过不少次 很多时候就算你用360.火绒的文件粉碎机,也粉碎不了! 那怎么办 ...

  8. 需要用计算机权限才能删除,您需要计算机管理员提供的权限才能对此文件进行更改,删不掉文件怎么处理...

    首先得确认,没有程序占用你想删除的文件,一般出现这种问题就是你想删除的文件被占用了,可以去进程中查看有没该文件的进程. 其次,你的权限不够,可以通过修改权限来删除该文件,具体方法: 1获得管理员权限: ...

  9. DT CMS致力于Spring Boot2.3.5 Vue前后端分离的RBAC权限框架(盛世美颜!)

    文章目录 前言 一.核心技术 二.系统架构 1.模块设计 1.后端模块 2.前端模块 2.安全设计 3.接口设计 三.页面演示 1.登录首页 2.首页展示 3.用户列表 1.用户添加 2.角色分配 4 ...

最新文章

  1. 曲苑杂坛--收缩数据库文件
  2. python ---Pandas时间序列:生成指定范围的日期
  3. C#和.Ne学习第五天
  4. Oracle KFED 和 KFOD 工具说明
  5. 和Leo一起做爱字符串的好孩子量子纠缠
  6. mysql5.7学习nosql_如何学习NoSQL?
  7. redis3---使用
  8. python nameko用于生产_用 Python、 RabbitMQ 和 Nameko 实现微服务
  9. 数据湖 data lake_在Data Lake中高效更新TB级数据的模式
  10. C语言预处理功能——关于字符串化和符号粘贴
  11. jbpm4.4表结构
  12. linux 常用脚本
  13. 高可用的分布式Hadoop大数据平台搭建,超详细,附代码。
  14. ERROR 1046 (3D000): No database selected
  15. 数据中台之血缘篇:Atlas 详解
  16. 给手机安装sqlite3
  17. SBOM(Software Bill of Materials,软件物料清单)
  18. 【JAVA】延迟队列DelayQueue的应用
  19. Win10如何自定义右键菜单-修改注册表(图文)
  20. C语言单目运算符和双目运算符、三目运算符

热门文章

  1. linux查看无线网卡频率,查看无线网卡工作模式
  2. python test suit_python unittest学习3---添加测试套件,testsuit
  3. PWN中的gdb调试, pwndbg,peda,gef 切换使用的方法;
  4. Python高阶函数和函数嵌套
  5. python-封装方法用于读取excel
  6. python网络编程:UDP方式传输数据
  7. c mysql 内存泄露_c代码连接mysql数据库内存泄露的问题
  8. pytorch torch.device类(表示在其上或将要分配torch.Tensor的设备)
  9. yunyang1994 tensorflow_yolov3 ./checkpoint/yolo3_coco_demo.ckpt does not exist !!! Now it starts to
  10. Nginx 正向代理与反向代理区别