V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
zjsxwc
V2EX  ›  程序员

平台后台员工权限管理你们一般是怎么实现的?

  •  
  •   zjsxwc ·
    zjsxwc · 2018-09-22 11:17:16 +08:00 · 3179 次点击
    这是一个创建于 2289 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我现在是用“角色”对每一个 GET、POST “接口”组合管理,然后给员工分配角色,每次请求时判断该员工角色下是否有对这个当前访问接口的权限。


    但感觉没必要这么麻烦,我想只要对每个角色定制自己的控制台页面数据(比如可以直接提供静态 html 用于展示,以及对应允许的接口权限列表 yml ),通过 session 保存当前控制台页面数据,然后只有从该控制台页面发出来的请求才算合法就行,也就是从原先“对每个角色分配接口” 变成 “对每个角色定制控制台页面”。
    第 1 条附言  ·  2018-09-22 13:55:20 +08:00

    @fxxkgw #1

    把接口 uri 提取存到一个表,然后把每个 uri 和用户关联起来

    我碰到的就是这个特别特别烦,每次加N个接口后,就要操作一遍这种把每个具体接口都录入数据库表,然后再手动把接口与角色关联数据一条一条存入数据库,现在想到的是通过个性化定制“控制台页面”,然后在定制时通过接口与正则匹配来判断接口是否被允许,比如一个“控制台页面数据”用json文件来保存:

    dashboard.json

    [
        {
            "name":"客服控制台页面",
            "html":"<ol><li><a>工单管理</a></li><li><a>客户管理</a></li></ol>",
            "allowedApis":[
                {
                    "uri":"/customers/.*",
                    "method":"POST"
                },
                {
                    "uri":"/orders",
                    "method":"GET"
                }
            ]
        }
    ]
    
    11 条回复    2018-09-25 15:22:04 +08:00
    fxxkgw
        1
    fxxkgw  
       2018-09-22 11:24:39 +08:00 via iPhone
    把接口 uri 提取存到一个表,然后把每个 uri 和用户关联起来,这个叫授权。
    请求时候通过中间件拦截用户请求,通过 session 拿到用户名,判断用户和 uri 是否在数据库里有关联,有则放行,无则返回权限不够。
    fxxkgw
        2
    fxxkgw  
       2018-09-22 11:27:31 +08:00 via iPhone
    上面有误,应该是把 uri 和组或者角色关联,用户放在组或角色表里。
    iwtbauh
        3
    iwtbauh  
       2018-09-22 11:35:17 +08:00 via Android
    我直接映射到 Unix 系统用户和数据库用户上,完全不用自己操心
    mmdsun
        4
    mmdsun  
       2018-09-22 11:37:17 +08:00 via Android
    前后端分类? html 的显示的按钮菜单都是登录后返回的权限 code 显示的。接口用注解+拦截器控制接口访问。或者用 shiro,spring security 框架。
    aristotll
        5
    aristotll  
       2018-09-22 11:45:59 +08:00
    spring security role
    UIXX
        6
    UIXX  
       2018-09-22 11:46:06 +08:00
    你说得没错,你前面叙述的情况是把“可视”不当作基本权限处理。后面的是把“可视”跟“可读”、“可编辑”等权限结合使用。后者更好。
    xuanbg
        7
    xuanbg  
       2018-09-22 13:02:17 +08:00
    服务端缓存一个和用户 Token 对应的数据结构,这个数据里面包含用户登录时得到的权限(一堆的 url)。在用户访问接口的时候,通过网关去判断当前用户访问的 url 在不在缓存的 url 列表里面,有就放行,没有返回未授权。
    honeycomb
        8
    honeycomb  
       2018-09-23 09:55:58 +08:00 via Android
    spring security/shiro
    ebingtel
        9
    ebingtel  
       2018-09-23 13:00:14 +08:00
    数据权限和接口权限分开……数据库里面不要存 url,应该存 url 对应的 endpoint
    zjsxwc
        10
    zjsxwc  
    OP
       2018-09-23 14:10:51 +08:00 via Android
    @ebingtel

    不是很理解,能稍微解释下吗?
    DavidNineRoc
        11
    DavidNineRoc  
       2018-09-25 15:22:04 +08:00   ❤️ 1
    memus
    id name parent_id
    1 客服控制台页面
    2 工单管理 1
    3 客户管理 1

    users(单角色,多角色也差不多)
    id name role_id
    1 david 1
    2 gps 2

    roles
    id name
    1 admin
    2 guest

    permissions
    id url method action menu_id
    1 /customers get R 3
    2 /customers post C 3
    3 /customers patch U 3
    4 /orders post R 2

    role_permission
    role_id permission_id
    1 1
    1 2
    1 3

    // 实际菜单根据用户拥有的 menus 渲染。当用户点击菜单才渲染权限
    // 如果点了客户管理前端会传 menu_id = 3
    这时候得到 permission=1,2,3 这三条记录,就知道这个页面有这三个权限,然后通过当前登录用户,角色,权限关联。
    这时候如果是 david 用户在 /customers 页面就有 CUR 权限
    而 gps 用户在 /customers 页面没有任何权限,这都只是给前端显示的

    // 而后端需要再建一个中间件验证权限,用户请求,根据页面的 url 和 method 得到唯一的 permission, 如果为 null,代表当前 url 不用验证权限,如果有记录,判断用户是否有这个权限,没有抛出异常,有,请求就通过
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2705 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 12:32 · PVG 20:32 · LAX 04:32 · JFK 07:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.