今天看同事写的权限管理功能时候发现这样的一个代码
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
只是为了举例编造的数据
1
alreadytaken 2020-12-14 17:03:00 +08:00
都是定义一堆权限模型 code,init 的时候拉一下,控制显示及路由
|
2
tomsun28 2020-12-14 17:15:29 +08:00
如果前端啥都不管,调用 restful api 遇到后端返回无权限 403 时,页面弹出你没有权限亲,这算不算骚操作🤣。jvm 系的后端 restful api 权限控制可以用 [sureness]( https://github.com/tomsun28/sureness)
|
3
yaphets666 2020-12-14 17:24:36 +08:00
我看那个 renrenfast 里头 用 addRoutes 实现权限管理 route 里头没有的路由自然就 404 了
|
4
lower 2020-12-14 17:36:21 +08:00
让后端 返回 当前用户拥有的权限列表,每次动态展示就行了,没有的权限就不展示咯
|
5
VDimos 2020-12-14 17:37:54 +08:00 via Android
yhgl-r,这个不会被打吗。。。
|
9
whileFalse 2020-12-14 18:05:23 +08:00
@yaphets666 #3 所以每个人的 route 是不同的么。
|
10
xuanbg 2020-12-14 18:24:34 +08:00
后端返回当前用户可用的导航数据以及功能权限。
|
11
sybb OP @tomsun28 感谢老哥 学到了
@lower 我理解的您的想法是直接把 route 数据放在后端存,其实上述代码中的 authCode 也是从后端拿到的权限 code 的集合,和您说的区别可能在于我们的项目拿到 code 之后要在前端匹配 判断一番 @VDimos 是的 我当时知道是他表示的实际意思的时候的确很想打人 @cking 我写的是举例的数据,格式是模仿的公司项目里的,就是用了拼音首字母的缩写,是不是很窒息哈哈哈 @alreadytaken 好嘞 心里有数了 感谢感谢 综合几位老哥的观点,心里有点数了,路由的控制应该就是存在后端,前端动态获取并渲染。页面中元素的权限控制大概逃不掉 v-if 、v-show 了 |
12
creanme 2020-12-14 19:12:58 +08:00
|
13
iapplebear 2020-12-14 19:13:31 +08:00
设计一个权限树,包括页面级权限按钮级权限等等。初始化的时候根据权限接口渲染菜单啊页面什么的,路由切换加个钩子就能处理跳转逻辑了
|
14
sybb OP |
15
ImACat 2020-12-14 20:23:31 +08:00
用框架,casbin
|
16
px920906 2020-12-14 20:56:51 +08:00
RBAC 参考下。权限代码用 实体-操作 组合表示,比如 对用户(1)/订单(2)进行增删改查(1234) 表示为 11,12,13,14,21,22,23,24 。一个用户对多个 role,一个 role 对多个权限。
路由,如果前后端交流无障碍,权限相关的代码保持一致,而且后端权限控制能做完善的情况,完全可以前端控制,无非就是展示还是隐藏。 |
17
12tall 2020-12-15 08:51:53 +08:00 1
介绍都是高大上,写的时候才发现还是那一地鸡毛
|
18
Quarter 2020-12-15 09:12:52 +08:00
我们这边只做了页面权限,通过配置好的路由参数在初始化的时候动态加载路由,但是还没想好按钮级别的权限怎么做
|
19
sybb OP |
20
KuroNekoFan 2020-12-15 10:02:57 +08:00
dirtywork,粒度多细就有多 dirty
|
21
sybb OP @KuroNekoFan 枯了
|
22
Quarter 2020-12-15 10:18:26 +08:00
@sybb 应该是这样的 因为设计到界面的具体功能,必然需要进行判断作不同的 ui 显示或者功能调用,少不了判断的,其实还是写死的各种判断逻辑在里边,所以还是在接口拦截方面可能更好入手一点
|
23
sybb OP @Quarter 页面控制和接口拦截基本上都会做, 前端页面做了控制就避免不了代码变得很难看了, 看来这个功能注定是个 dirtywork
|
24
px920906 2020-12-15 11:53:42 +08:00 via Android
@sybb 只是举例子,具体要限制哪些实体和操作根据你实际情况。这种做法的话,前端页面元素展示与否也容易实现,比如用户列表每一行的编辑用户按钮,用 vue 的话大概就是 v-show="auth.includes(user.update)"
|
25
KuroNekoFan 2020-12-15 14:48:53 +08:00 via iPhone
@sybb 我自己没做过,不过如果要我做,那我应该只在前端针对页面级别进行控制,比如 a 用户只能访问哪些 routes,至于具体的 crud 操作权限控制由后端自己处理,前端给出友好提示即可
不过这种有点架构设计的决定好像不是前端说了算的🙃 |
26
sybb OP |
27
rophie123 2021-01-08 12:01:30 +08:00
如果不同用户登录进去显示的界面或者操作逻辑都不太一样,需不需要后端分成两个模块去单独写?实际开发起来并不单单是显不显示某个按钮那么简单吧
|