Hasura引擎匿名用户权限配置:订单插入与ID返回问题咨询
问题1解决方案
核心思路是通过反向关系的行级插入检查,限制匿名用户仅能在创建订单的嵌套场景下插入地址数据,无法单独插入:
- 先在
order_address表创建反向一对一关系:命名为bind_order,关联规则为order_address.id = order.address_id - 给匿名角色配置
order_address的插入权限:- 字段权限:仅开放
street、number两个可提交字段,自动生成的id字段无需开放 - 插入行检查规则:添加条件
{"bind_order":{"id":{"_is_null":false}}}
- 字段权限:仅开放
- 管理员角色的
order_address插入权限不添加上述检查规则,保留单独插入地址的能力
原理:插入操作的行级检查会校验插入完成后的数据是否符合规则。如果匿名用户单独调用insert_order_address插入地址,插入完成后没有关联的订单绑定,检查不通过,插入失败;只有通过insert_order嵌套插入地址时,订单和地址会在同一个事务内完成绑定,检查规则通过,插入成功。
问题2解决方案
有两种成熟方案可选,按需取用:
方案1(适合仅需创建时返回ID,后续无需查询的场景)
直接给匿名角色开放order表id字段的查询权限,同时增加两个限制:
- 禁用匿名角色的
order表聚合查询权限 - 给匿名角色的
order表查询权限添加行级限制:每次最多返回1条数据
因为订单ID是UUID格式,全局唯一且不可暴力枚举,用户没有具体ID值的情况下根本无法检索到其他订单的信息,也无法批量拉取全量订单ID,完全满足安全要求。
方案2(适合需要后续支持用户查询订单状态的场景)
- 给
order表新增access_key字段,类型为UUID,默认值设为gen_random_uuid(),设置该字段不可修改 - 给匿名角色的
order表查询权限添加行级检查规则:{"access_key":{"_eq":"X-Hasura-Access-Key"}} - 匿名用户创建订单时,在
insert_order的返回字段中同时返回id和access_key - 后续用户查询订单时,需要在请求头中携带自己的
X-Hasura-Access-Key,仅能查到自己对应的订单信息,完全不会泄露其他订单的ID和数据
内容的提问来源于stack exchange,提问作者fede
相关产品推荐
相关产品推荐

