tdesign-vue-next-starter icon indicating copy to clipboard operation
tdesign-vue-next-starter copied to clipboard

关于权限相关讨论

Open timi137137 opened this issue 2 years ago • 7 comments

目前市面上有这么几种较为通用的权限方式,希望各位能投票选出你所认为最好的权限方式,或提出更好的意见。

前端角色权限

实现原理: 在前端固定写死路由的权限,指定路由有哪些权限可以查看。只初始化通用的路由,需要权限才能访问的路由没有被加入路由表内。在登陆后或者其他方式获取用户角色后,通过角色去遍历路由表,获取该角色可以访问的路由表,生成路由表,再通过 添加到路由实例,实现权限的过滤。 缺点: 权限相对不自由,如果后台改动角色,前台也需要跟着改动。适合角色较固定的系统

1. 通过用户角色来过滤菜单(前端方式控制),菜单和路由分开配置

2. 通过用户角色来过滤菜单(前端方式控制),菜单由路由配置自动生成

后端角色权限

实现原理: 是通过接口动态生成路由表,且遵循一定的数据结构返回。前端根据需要处理该数据为可识别的结构,再通过添加到路由实例,实现权限的动态生成。

3. 通过后台来动态生成路由表(后端方式控制)

4. 三种方式集成到项目中由用户自行选择

timi137137 avatar Jul 07 '22 09:07 timi137137

👋 @timi137137,感谢给 TDesign 提出了 issue。 请根据 issue 模版确保背景信息的完善,我们将调查并尽快回复你。

github-actions[bot] avatar Jul 07 '22 09:07 github-actions[bot]

♥️ 有劳 @pengYYYYY 尽快确认问题。 确认有效后将下一步计划和可能需要的时间回复给 @timi137137 。

github-actions[bot] avatar Jul 07 '22 09:07 github-actions[bot]

4吧,多点选择,毕竟需求不是统一的

JokerLoLgrey avatar Jul 27 '22 01:07 JokerLoLgrey

3 权限数据理应由后台提供, 前端负责交互和渲染

setli avatar Aug 07 '22 05:08 setli

3 看过好几个开源项目都是由后台提供权限数据, 前端负责交互和渲染

pekxie avatar Aug 07 '22 14:08 pekxie

3 权限数据理应由后台提供, 前端负责交互和渲染

ElanYoung avatar Aug 09 '22 02:08 ElanYoung

3 权限数据理应由后台提供, 前端负责交互和渲染

liect avatar Aug 09 '22 06:08 liect

统计结束,更多人选3,这几天会pr更新

timi137137 avatar Aug 20 '22 17:08 timi137137

通过后台方式的话, 开发阶段新增路由时,还需要后端配合修改接口? @timi137137

Valar103769 avatar Sep 14 '22 03:09 Valar103769

通过后台方式的话, 开发阶段新增路由时,还需要后端配合修改接口? @timi137137

前端后端统一一个格式,后端新增前端就会自动新增

timi137137 avatar Sep 14 '22 03:09 timi137137

通过后台方式的话, 开发阶段新增路由时,还需要后端配合修改接口? @timi137137

前端后端统一一个格式,后端新增前端就会自动新增

开发阶段,还要后端配合,不太科学, 我觉得antd pro那种在routes的配置对象里中有个access函数属性挺好的

类似下面这样

await 获取后端数据结构() // 建议只返回需要权限的路由,比较简单
const access = (name, 后端数据结构) => true  ||  false // 默认返回true
const routes = [{
// ...
access: access
}]
new Router({routes})

由于 access默认返回true,这样在开发阶段,注释掉access属性就行, 挺方便的

我看了,你们的permission.js文件里, 已经是这样做了, 跟 vue-elemnet-admin 保持一致也挺好

  await userStore.getUserInfo(); // 获取后端数据结构() 

        const { roles } = userStore;

        await permissionStore.initRoutes(roles); // const access = (name, 后端数据结构) => true  ||  false // 默认返回true

        if (router.hasRoute(to.name)) {
          next(); // new Router({routes})

Valar103769 avatar Sep 14 '22 04:09 Valar103769