V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gaojiangouyu
V2EX  ›  程序员

在前后端分离的环境下,前端和后端的权限要共享还是说彻底分开?

  •  
  •   gaojiangouyu · 2021-08-02 22:52:56 +08:00 · 2973 次点击
    这是一个创建于 996 天前的主题,其中的信息可能已经有所发展或是发生改变。

    设计:在一个系统中,每一个能被用户访问到的资源都有一个对应的 PermissionCode,权限标识。

    方案 1:由后端开发人员定义一套权限标识,每一个接口对应到一个权限标识,前后端共享这套权限标识,用户登陆的时候获取到当前用户的所有权限标识,根据用户拥有的权限标识来决定要不要渲染某个特定的组件,如:表单,按钮等

    方案 1 的优点:前后端共用一套权限标识,减少了很多维护成本

    方案 1 的缺点:前端的组件和后端接口的关系有时不是一一对应的,如:前端有一个 panel,上面有三个 tab1,tab2,tab3,这三个 tab 对应到后端的某个接口 A,虽然用户拥有了接口 A 的权限,但是由于用户由于角色问题无法访问到 tab3 的数据,接口 A 只会返回 tab1,tab2 的数据,由于公用权限标识,这个时候无法隐藏掉 tab3 (你可能会觉得 tab3 可以显示,只是没数据而已,但是可能存在一些场景是需要隐藏掉的,只能从设计 ui 上面去调整)

    方案 2:前端只管前端的权限标识,后端只管后端的权限标识,分成两套,用户登陆的时候只会获取到和前端相关的权限标识,并根据具体业务去渲染不同的组件。

    方案 2 的优点:可以避免方案 1 出现的问题

    方案 2 的缺点:增大了维护成本

    目前实践上,哪种方案是比较好的?

    18 条回复    2021-08-04 09:27:37 +08:00
    calmzhu
        1
    calmzhu  
       2021-08-02 22:56:12 +08:00
    数据权限也加上权限标识
    binux
        2
    binux  
       2021-08-02 23:13:21 +08:00 via Android
    > 由于用户由于角色问题无法访问到 tab3 的数据
    不要混着用“角色”,全部用权限控制。你非得要角色就用角色继承权限。
    gaojiangouyu
        3
    gaojiangouyu  
    OP
       2021-08-02 23:26:34 +08:00
    @binux 这里涉及另外一个概念:数据权限,是在接口内部去判断的,如果你只用一个接口去返回三个 tab 的数据,那么必然会存在不对应的问题
    chanchan
        4
    chanchan  
       2021-08-02 23:36:37 +08:00
    方案二吧 前后端分离
    wangbenjun5
        5
    wangbenjun5  
       2021-08-02 23:36:42 +08:00
    前端权限没那个必要做的十全十美,比如说精确到一个页面或者按钮,我觉得后端接口权限控制好就差不多了。

    前端没做权限控制最多就是点开页面的时候调用接口发现没权限,难看是难看点,但是简单易用,完全做到前后端一一对应也不现实。。。一般这种管理后台都是自己人用,没必要。
    pengtdyd
        6
    pengtdyd  
       2021-08-02 23:43:06 +08:00
    前端的权限不是后台给的?
    gaojiangouyu
        7
    gaojiangouyu  
    OP
       2021-08-02 23:44:30 +08:00
    @wangbenjun5 因为这个给业务部门投诉了,近期。
    binux
        8
    binux  
       2021-08-02 23:48:11 +08:00 via Android
    @gaojiangouyu 可以,不管你叫什么,在哪判断的。权限标识就是 gold rule,前后端共享,不会突然多出来一个角色使得接口变化。
    xuanbg
        9
    xuanbg  
       2021-08-03 07:12:06 +08:00
    前端完全可以很简单地根据接口获取的集合内容是否为空来决定是否显示 tab 啊。
    eudore
        10
    eudore  
       2021-08-03 08:28:03 +08:00
    前端请求用户显示菜单列表 api,由后端数据权限控制返回的菜单列表,在后端授权时权限就自动带上了对应菜单的数据权限。
    radiocontroller
        11
    radiocontroller  
       2021-08-03 09:31:43 +08:00
    你为什么要管后端的 tab3 角色问题,后端给你 tab3 权限你就显示,不给就不显示
    TimPeake
        12
    TimPeake  
       2021-08-03 09:49:37 +08:00
    前端权限只是为了体验 ,其他的真的不要想太多
    dfkjgklfdjg
        13
    dfkjgklfdjg  
       2021-08-03 10:06:50 +08:00
    我们是写了一个角色 /权限管理页面,由 admin 账户管理分配,登陆后获取 permissionList,渲染路由以及页面内按钮。

    只是如果 admin 新增 /修改了标识符,我这边(前端)需要去更新对应页面的权鉴标识。
    emeab
        14
    emeab  
       2021-08-03 10:07:28 +08:00
    前端是显示. 后端才是鉴权.
    lolizeppelin
        15
    lolizeppelin  
       2021-08-03 11:28:26 +08:00
    返回数据里 字段 undifine 就取消这列不就行了
    KouShuiYu
        16
    KouShuiYu  
       2021-08-03 11:41:52 +08:00
    鉴权我都是在前端和后端的路由中做的,挺方便的,这是我平时建项目的模版,
    前端:
    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
    zsan6
        17
    zsan6  
       2021-08-03 14:46:43 +08:00
    拆分操作权限和数据权限,都由后端控制比较好点
    QlanQ
        18
    QlanQ  
       2021-08-04 09:27:37 +08:00
    最小单位就是权限,角色只是 一组 权限的合集,只是 为了 设置权限的时候方便点,和 鉴权无关
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1159 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:37 · PVG 02:37 · LAX 11:37 · JFK 14:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.