4

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

 11 months ago
source link: https://www.v2ex.com/t/980835
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  Web Dev

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

  justthewayyouare · 7 小时 4 分钟前 via iPhone · 1645 次点击

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

21 条回复    2023-10-11 15:26:50 +08:00
PerFectTime

PerFectTime      6 小时 59 分钟前

换个思路,不应该限制传参,应该限制返回参数。知道参数又如何,接口不给你返回你想要的数据
justthewayyouare

justthewayyouare      6 小时 57 分钟前 via iPhone

@PerFectTime 这样的话要加一堆判断逻辑啊,我是想用 casbin 来控制,但是 casbin 只能控制接口
xomix

xomix      6 小时 56 分钟前

实现方法很多,最简单的就是你听过 API Gateway 吗?他就可以用来做这个。
jaredyam

jaredyam      6 小时 56 分钟前

if (id not in xxx) { return EMPTY; }?
bhbhxy

bhbhxy      6 小时 54 分钟前

header 中携带 token 信息,后台接收到 token 后判断角色,管理员角色返回所有数据,用户返回限制后的数据,如果用户查询的 id 不是其同级,返回无权限或者找不到数据的提示
HKNeetsDieSoon

HKNeetsDieSoon      6 小时 45 分钟前

加个方法判断 xxx 是否在请求方的数据范围内,通过级别判断什么都行啊
yolee599

yolee599      6 小时 43 分钟前 via Android

if (user.level < USER_LEVEL_ADMIN) return NULL;
else return id.info;
xiaoHuaJia

xiaoHuaJia      6 小时 38 分钟前

用户信息放到 token 中在网关解析之后放入头信息中,在使用的时候拿就好了。userId 这种参数根本不需要通过接口传参,token 也是放入全局头信息中,对于用户来说就是无感知的
linyinma

linyinma      6 小时 35 分钟前   ❤️ 8

把功能权限 和 数据权限混为一谈
justthewayyouare

justthewayyouare      6 小时 32 分钟前 via iPhone

@xiaoHuaJia 自己的 usrid 肯定是 token 拿了,我说的是别人的 id
lzxz1234

lzxz1234      6 小时 31 分钟前

查询判断:
if(!loginUser.hasUserAuth(targetUserId)) {
return "user not exists";
}
或者在请求用户列表的时候把返回的 id 用 session 作 key 加密一下,查询的时候再解,这样就没法猜用户 ID 了
NutChocHoney

NutChocHoney      6 小时 27 分钟前

数据权限是根据业务来的,不加逻辑判断不行吧,没用过 casbin,但 rbac 的话都差不多吧
lldld

lldld      6 小时 21 分钟前

粗暴一点的办法就是把 "用户只能查询他的同级" 这个规则自动放到查询条件里面去.

比如 select * from user where user_id = xxx and user_level <= CALLER_USER_LEVEL;
nothingistrue

nothingistrue      6 小时 17 分钟前

一般的权限管理组件只管到 URL 资源这一级别,不会往下再管,而你这个是业务逻辑权限,需要下层代码手动处理,或者更高级/复杂的权限管理组件。
bitmin

bitmin      5 小时 31 分钟前

最简单的办法就是拆成两个接口了吧

一个接口查同级

一个接口查所有人
xuanbg

xuanbg      4 小时 38 分钟前

数据权限可以抽象,但必须要约定数据筛选字段,缺点是无法支持分页。要支持分页,就必须在查询 sql 中注入额外的查询条件,这个实现起来相当复杂,我一般都是直接拼条件了。
@NutChocHoney
SkyLine7

SkyLine7      4 小时 6 分钟前

这不是按钮权限,这是数据权限
eastjoehan

eastjoehan      3 小时 13 分钟前

设置角色的权限范围,然后按照权限范围动态注入 SQL 条件,这是最简单的做法
jokechen

jokechen      3 小时 12 分钟前 via iPhone

@justthewayyouare 判断 token 的 userId 是否与传参的 userId 一致。
jiangzm

jiangzm      3 小时 4 分钟前

数据权限接口分开, 而不是在接口里面判断
cslive

cslive      19 分钟前

从 session 或者 token 获取用户信息,前端默认不可信

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK