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

权限管理这块怎么限制传参?

  •  
  •   justthewayyouare · 2023-10-11 08:41:45 +08:00 via iPhone · 3225 次点击
    这是一个创建于 403 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如两个角色,一个管理员,一个用户。 他们都有/userinfo?id=xxx 这个接口的权限, 管理员可以查询任何人,所以对 xxx 没有限制,用户只能查询他的同级,xxx 的范围是他的同级,如何防止用户知道管理员 id 后查管理员的信息?

    22 条回复    2023-10-12 09:09:38 +08:00
    PerFectTime
        1
    PerFectTime  
       2023-10-11 08:47:16 +08:00   ❤️ 2
    换个思路,不应该限制传参,应该限制返回参数。知道参数又如何,接口不给你返回你想要的数据
    justthewayyouare
        2
    justthewayyouare  
    OP
       2023-10-11 08:49:07 +08:00 via iPhone
    @PerFectTime 这样的话要加一堆判断逻辑啊,我是想用 casbin 来控制,但是 casbin 只能控制接口
    xomix
        3
    xomix  
       2023-10-11 08:49:40 +08:00
    实现方法很多,最简单的就是你听过 API Gateway 吗?他就可以用来做这个。
    jaredyam
        4
    jaredyam  
       2023-10-11 08:50:12 +08:00
    if (id not in xxx) { return EMPTY; }?
    bhbhxy
        5
    bhbhxy  
       2023-10-11 08:51:50 +08:00
    header 中携带 token 信息,后台接收到 token 后判断角色,管理员角色返回所有数据,用户返回限制后的数据,如果用户查询的 id 不是其同级,返回无权限或者找不到数据的提示
    HKNeetsDieSoon
        6
    HKNeetsDieSoon  
       2023-10-11 09:01:06 +08:00
    加个方法判断 xxx 是否在请求方的数据范围内,通过级别判断什么都行啊
    yolee599
        7
    yolee599  
       2023-10-11 09:02:48 +08:00 via Android
    if (user.level < USER_LEVEL_ADMIN) return NULL;
    else return id.info;
    xiaoHuaJia
        8
    xiaoHuaJia  
       2023-10-11 09:08:13 +08:00
    用户信息放到 token 中在网关解析之后放入头信息中,在使用的时候拿就好了。userId 这种参数根本不需要通过接口传参,token 也是放入全局头信息中,对于用户来说就是无感知的
    linyinma
        9
    linyinma  
       2023-10-11 09:11:00 +08:00   ❤️ 10
    把功能权限 和 数据权限混为一谈
    justthewayyouare
        10
    justthewayyouare  
    OP
       2023-10-11 09:13:59 +08:00 via iPhone
    @xiaoHuaJia 自己的 usrid 肯定是 token 拿了,我说的是别人的 id
    lzxz1234
        11
    lzxz1234  
       2023-10-11 09:14:28 +08:00
    查询判断:
    if(!loginUser.hasUserAuth(targetUserId)) {
    return "user not exists";
    }
    或者在请求用户列表的时候把返回的 id 用 session 作 key 加密一下,查询的时候再解,这样就没法猜用户 ID 了
    NutChocHoney
        12
    NutChocHoney  
       2023-10-11 09:18:56 +08:00
    数据权限是根据业务来的,不加逻辑判断不行吧,没用过 casbin,但 rbac 的话都差不多吧
    lldld
        13
    lldld  
       2023-10-11 09:25:19 +08:00
    粗暴一点的办法就是把 "用户只能查询他的同级" 这个规则自动放到查询条件里面去.

    比如 select * from user where user_id = xxx and user_level <= CALLER_USER_LEVEL;
    nothingistrue
        14
    nothingistrue  
       2023-10-11 09:29:06 +08:00
    一般的权限管理组件只管到 URL 资源这一级别,不会往下再管,而你这个是业务逻辑权限,需要下层代码手动处理,或者更高级/复杂的权限管理组件。
    bitmin
        15
    bitmin  
       2023-10-11 10:14:45 +08:00
    最简单的办法就是拆成两个接口了吧

    一个接口查同级

    一个接口查所有人
    xuanbg
        16
    xuanbg  
       2023-10-11 11:07:59 +08:00
    数据权限可以抽象,但必须要约定数据筛选字段,缺点是无法支持分页。要支持分页,就必须在查询 sql 中注入额外的查询条件,这个实现起来相当复杂,我一般都是直接拼条件了。
    @NutChocHoney
    SkyLine7
        17
    SkyLine7  
       2023-10-11 11:40:16 +08:00
    这不是按钮权限,这是数据权限
    JoeDH
        18
    JoeDH  
       2023-10-11 12:32:25 +08:00
    设置角色的权限范围,然后按照权限范围动态注入 SQL 条件,这是最简单的做法
    jokechen
        19
    jokechen  
       2023-10-11 12:34:14 +08:00 via iPhone
    @justthewayyouare 判断 token 的 userId 是否与传参的 userId 一致。
    jiangzm
        20
    jiangzm  
       2023-10-11 12:42:19 +08:00
    数据权限接口分开, 而不是在接口里面判断
    cslive
        21
    cslive  
       2023-10-11 15:26:50 +08:00
    从 session 或者 token 获取用户信息,前端默认不可信
    xiaoHuaJia
        22
    xiaoHuaJia  
       2023-10-12 09:09:38 +08:00
    @cslive 别人的是什么意思?别的平台的 Id ?没理解
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1300 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:25 · PVG 01:25 · LAX 09:25 · JFK 12:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.