如何优雅的实现权限管理功能?

2020-12-14 16:17:31 +08:00
 sybb

今天看同事写的权限管理功能时候发现这样的一个代码

router.beforeEach(async (to: Route, from: Route, next) => {
  if (to.path === "/") {
    authCode && authCode.includes("yhgl-r") ? next("/userManagement") : next("/home");
  }
})

看到这个yhgl-r我想了很久都没想出来是什么意思,还以为是什么用户身份码。

问了同事才知道 yhgl-r 指的是 用户管理只读

借此想请教两个问题:

1. 后台在定义模块时候大家都是怎么定义的?

比如上述代码中就是用模块名字的首字母缩写来作为模块的 code,觉得挺不灵活优雅的,目前能想到的方案是不用缩写,有咩有其他模块定义方法?

2. 前端拿到一大堆要限制的模块 code 后,有没有什么好的处理方案?

目前见到的都是 v-if/v-show 和控制路由结合来判断是不是显示某个模块,有些模块权限复杂的话就需要一大串的判断语句,代码可读性不怎么好,有没有其他更高明的方法呢?

3. 或者有没有别的更好的权限管理方案

yhgl-r/userManagement/home只是为了举例编造的数据

4373 次点击
所在节点    Vue.js
27 条回复
alreadytaken
2020-12-14 17:03:00 +08:00
都是定义一堆权限模型 code,init 的时候拉一下,控制显示及路由
tomsun28
2020-12-14 17:15:29 +08:00
如果前端啥都不管,调用 restful api 遇到后端返回无权限 403 时,页面弹出你没有权限亲,这算不算骚操作🤣。jvm 系的后端 restful api 权限控制可以用 [sureness]( https://github.com/tomsun28/sureness)
yaphets666
2020-12-14 17:24:36 +08:00
我看那个 renrenfast 里头 用 addRoutes 实现权限管理 route 里头没有的路由自然就 404 了
lower
2020-12-14 17:36:21 +08:00
让后端 返回 当前用户拥有的权限列表,每次动态展示就行了,没有的权限就不展示咯
VDimos
2020-12-14 17:37:54 +08:00
yhgl-r,这个不会被打吗。。。
fffang
2020-12-14 17:46:08 +08:00
@lower 这样的话,我改个 Url 不就进去了?
lower
2020-12-14 17:47:51 +08:00
@fffang 路由也是动态注册
cking
2020-12-14 17:49:16 +08:00
@VDimos 举例编造的数据 公司的话 看心情吧 哈哈哈
whileFalse
2020-12-14 18:05:23 +08:00
@yaphets666 #3 所以每个人的 route 是不同的么。
xuanbg
2020-12-14 18:24:34 +08:00
后端返回当前用户可用的导航数据以及功能权限。
sybb
2020-12-14 19:02:23 +08:00
@tomsun28 感谢老哥 学到了

@lower 我理解的您的想法是直接把 route 数据放在后端存,其实上述代码中的 authCode 也是从后端拿到的权限 code 的集合,和您说的区别可能在于我们的项目拿到 code 之后要在前端匹配 判断一番

@VDimos 是的 我当时知道是他表示的实际意思的时候的确很想打人

@cking 我写的是举例的数据,格式是模仿的公司项目里的,就是用了拼音首字母的缩写,是不是很窒息哈哈哈

@alreadytaken 好嘞 心里有数了 感谢感谢


综合几位老哥的观点,心里有点数了,路由的控制应该就是存在后端,前端动态获取并渲染。页面中元素的权限控制大概逃不掉 v-if 、v-show 了
creanme
2020-12-14 19:12:58 +08:00
要不你看看这篇文章 https://juejin.cn/post/6844903478880370701

vue-element-admin 作者写的
iapplebear
2020-12-14 19:13:31 +08:00
设计一个权限树,包括页面级权限按钮级权限等等。初始化的时候根据权限接口渲染菜单啊页面什么的,路由切换加个钩子就能处理跳转逻辑了
sybb
2020-12-14 20:17:36 +08:00
@creanme 学到啦 感谢 基本思路还是路由数据后端来存,前端动态获取路由并渲染菜单
@iapplebear 看大家的处理方法基本也是这样,那我就老实这么处理了,感谢感谢
ImACat
2020-12-14 20:23:31 +08:00
用框架,casbin
px920906
2020-12-14 20:56:51 +08:00
RBAC 参考下。权限代码用 实体-操作 组合表示,比如 对用户(1)/订单(2)进行增删改查(1234) 表示为 11,12,13,14,21,22,23,24 。一个用户对多个 role,一个 role 对多个权限。
路由,如果前后端交流无障碍,权限相关的代码保持一致,而且后端权限控制能做完善的情况,完全可以前端控制,无非就是展示还是隐藏。
12tall
2020-12-15 08:51:53 +08:00
介绍都是高大上,写的时候才发现还是那一地鸡毛
Quarter
2020-12-15 09:12:52 +08:00
我们这边只做了页面权限,通过配置好的路由参数在初始化的时候动态加载路由,但是还没想好按钮级别的权限怎么做
sybb
2020-12-15 09:40:40 +08:00
@px920906 “对用户(1)/订单(2)进行增删改查(1234) 表示为 11,12,13,14,21,22,23,24 ” 意思是每个用户的权限配置都要细化到每个模块的每个动作上吗


@Quarter 按钮级别的控制 看起来大家基本上也都是配置权限在后端,前端拉数据然后判断具体某个按钮的隐藏和显示
KuroNekoFan
2020-12-15 10:02:57 +08:00
dirtywork,粒度多细就有多 dirty

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/735320

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX