
设计:在一个系统中,每一个能被用户访问到的资源都有一个对应的 PermissionCode,权限标识。
方案 1:由后端开发人员定义一套权限标识,每一个接口对应到一个权限标识,前后端共享这套权限标识,用户登陆的时候获取到当前用户的所有权限标识,根据用户拥有的权限标识来决定要不要渲染某个特定的组件,如:表单,按钮等
方案 1 的优点:前后端共用一套权限标识,减少了很多维护成本
方案 1 的缺点:前端的组件和后端接口的关系有时不是一一对应的,如:前端有一个 panel,上面有三个 tab1,tab2,tab3,这三个 tab 对应到后端的某个接口 A,虽然用户拥有了接口 A 的权限,但是由于用户由于角色问题无法访问到 tab3 的数据,接口 A 只会返回 tab1,tab2 的数据,由于公用权限标识,这个时候无法隐藏掉 tab3 (你可能会觉得 tab3 可以显示,只是没数据而已,但是可能存在一些场景是需要隐藏掉的,只能从设计 ui 上面去调整)
方案 2:前端只管前端的权限标识,后端只管后端的权限标识,分成两套,用户登陆的时候只会获取到和前端相关的权限标识,并根据具体业务去渲染不同的组件。
方案 2 的优点:可以避免方案 1 出现的问题
方案 2 的缺点:增大了维护成本
目前实践上,哪种方案是比较好的?
1 calmzhu Aug 2, 2021 数据权限也加上权限标识 |
2 binux Aug 2, 2021 via Android > 由于用户由于角色问题无法访问到 tab3 的数据 不要混着用“角色”,全部用权限控制。你非得要角色就用角色继承权限。 |
3 gaojiangouyu OP @binux 这里涉及另外一个概念:数据权限,是在接口内部去判断的,如果你只用一个接口去返回三个 tab 的数据,那么必然会存在不对应的问题 |
4 chanchan Aug 2, 2021 方案二吧 前后端分离 |
5 wangbenjun5 Aug 2, 2021 前端权限没那个必要做的十全十美,比如说精确到一个页面或者按钮,我觉得后端接口权限控制好就差不多了。 前端没做权限控制最多就是点开页面的时候调用接口发现没权限,难看是难看点,但是简单易用,完全做到前后端一一对应也不现实。。。一般这种管理后台都是自己人用,没必要。 |
6 pengtdyd Aug 2, 2021 前端的权限不是后台给的? |
7 gaojiangouyu OP @wangbenjun5 因为这个给业务部门投诉了,近期。 |
8 binux Aug 2, 2021 via Android @gaojiangouyu 可以,不管你叫什么,在哪判断的。权限标识就是 gold rule,前后端共享,不会突然多出来一个角色使得接口变化。 |
9 xuanbg Aug 3, 2021 前端完全可以很简单地根据接口获取的集合内容是否为空来决定是否显示 tab 啊。 |
10 eudore Aug 3, 2021 前端请求用户显示菜单列表 api,由后端数据权限控制返回的菜单列表,在后端授权时权限就自动带上了对应菜单的数据权限。 |
11 radiocontroller Aug 3, 2021 你为什么要管后端的 tab3 角色问题,后端给你 tab3 权限你就显示,不给就不显示 |
12 TimPeake Aug 3, 2021 前端权限只是为了体验 ,其他的真的不要想太多 |
13 94 Aug 3, 2021 我们是写了一个角色 /权限管理页面,由 admin 账户管理分配,登陆后获取 permissionList,渲染路由以及页面内按钮。 只是如果 admin 新增 /修改了标识符,我这边(前端)需要去更新对应页面的权鉴标识。 |
14 2kCS5c0b0ITXE5k2 Aug 3, 2021 前端是显示. 后端才是鉴权. |
15 lolizeppelin Aug 3, 2021 返回数据里 字段 undifine 就取消这列不就行了 |
16 KouShuiYu Aug 3, 2021 鉴权我都是在前端和后端的路由中做的,挺方便的,这是我平时建项目的模版, 前端: https://github.com/chenkai0520/vite-template/blob/main/src/router/index.js 后端: https://github.com/chenkai0520/koa-sequelize-template/blob/main/app/router/index.js |
17 zsan6 Aug 3, 2021 拆分操作权限和数据权限,都由后端控制比较好点 |
18 QlanQ Aug 4, 2021 最小单位就是权限,角色只是 一组 权限的合集,只是 为了 设置权限的时候方便点,和 鉴权无关 |