权限管理这块怎么限制传参? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
justthewayyouare
V2EX    Web Dev

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

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

    比如两个角色,一个管理员,一个用户。 他们都有/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     Solana     1263 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 17:14 PVG 01:14 LAX 09:14 JFK 12:14
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86