V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sybb
V2EX  ›  Vue.js

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

  •  1
     
  •   sybb · 2020-12-14 16:17:31 +08:00 · 4373 次点击
    这是一个创建于 1469 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    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只是为了举例编造的数据

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

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

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

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

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


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

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


    @Quarter 按钮级别的控制 看起来大家基本上也都是配置权限在后端,前端拉数据然后判断具体某个按钮的隐藏和显示
    KuroNekoFan
        20
    KuroNekoFan  
       2020-12-15 10:02:57 +08:00
    dirtywork,粒度多细就有多 dirty
    sybb
        21
    sybb  
    OP
       2020-12-15 10:08:25 +08:00
    @KuroNekoFan 枯了
    Quarter
        22
    Quarter  
       2020-12-15 10:18:26 +08:00
    @sybb 应该是这样的 因为设计到界面的具体功能,必然需要进行判断作不同的 ui 显示或者功能调用,少不了判断的,其实还是写死的各种判断逻辑在里边,所以还是在接口拦截方面可能更好入手一点
    sybb
        23
    sybb  
    OP
       2020-12-15 11:30:45 +08:00
    @Quarter 页面控制和接口拦截基本上都会做, 前端页面做了控制就避免不了代码变得很难看了, 看来这个功能注定是个 dirtywork
    px920906
        24
    px920906  
       2020-12-15 11:53:42 +08:00 via Android
    @sybb 只是举例子,具体要限制哪些实体和操作根据你实际情况。这种做法的话,前端页面元素展示与否也容易实现,比如用户列表每一行的编辑用户按钮,用 vue 的话大概就是 v-show="auth.includes(user.update)"
    KuroNekoFan
        25
    KuroNekoFan  
       2020-12-15 14:48:53 +08:00 via iPhone
    @sybb 我自己没做过,不过如果要我做,那我应该只在前端针对页面级别进行控制,比如 a 用户只能访问哪些 routes,至于具体的 crud 操作权限控制由后端自己处理,前端给出友好提示即可
    不过这种有点架构设计的决定好像不是前端说了算的🙃
    sybb
        26
    sybb  
    OP
       2020-12-15 19:55:54 +08:00
    @px920906 好嘞 感谢
    @KuroNekoFan 是的 routes 控制是一部分
    rophie123
        27
    rophie123  
       2021-01-08 12:01:30 +08:00
    如果不同用户登录进去显示的界面或者操作逻辑都不太一样,需不需要后端分成两个模块去单独写?实际开发起来并不单单是显不显示某个按钮那么简单吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1180 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 23:50 · PVG 07:50 · LAX 15:50 · JFK 18:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.