uni-app schema 权限控制表现不一致 - 已解决

uni-app schema 权限控制表现不一致 - 已解决

产品分类:  
uniCloud/腾讯云  

### 操作步骤:

```json
"permission": {
"read": " auth.uid in get(`database.studios.${doc.stid._id}`).write.orders",
"create": "'order_create' in auth.permission",
"update": "auth.uid in get(`database.studios.${doc.stid._id}`).write.orders",
"delete": false
}

预期结果:

read可以通过,update也应该可以通过


### 实际结果:

read可以,update却不行

bug描述:

"permission": {
"read": " auth.uid in get(`database.studios.${doc.stid._id}`).write.orders",
"create": "'order_create' in auth.permission",
"update": "auth.uid in get(`database.studios.${doc.stid._id}`).write.orders",
"delete": false
}

read和update两个完全一致的权限控制,read可以通过,update却不行,有点懵圈了,试了doc.stid, doc.stid[0]._id,全不行。


更多关于uni-app schema 权限控制表现不一致 - 已解决的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

报错为:get方法内参数值必须唯一位置。 如果不是唯一值,那么read也应该不能通过,中间没有任何步骤,点击查看修改。

更多关于uni-app schema 权限控制表现不一致 - 已解决的实战教程也可以访问 https://www.itying.com/category-93-b0.html


另外,在权限校验的过程,或运算 “||” 如果前面已经通过,不应该再去校验后面的啊,但是,schema里面似乎都要校验,不管是或与非,也就是检查get是否为唯一位置。 比如:“auth.uid == doc.uid || auth.uid in get(database.studios.${doc.stid._id}).write.orders” 如果左边通过了,是不是直接应该忽略右边呢?何必再去校验右边?

doc.xxx是跟你的where有关的,你的where条件怎么写的

回复 DCloud_uniCloud_WYQ: 那应该就是where条件的原因了

这是一个典型的uniCloud权限配置问题。read和update虽然使用了相同的权限表达式,但它们在执行时的上下文是不同的。

在update操作中,权限验证发生在数据修改前,此时doc对象引用的是更新前的旧数据。如果你的更新操作修改了stid字段,那么在update权限验证时获取的仍然是修改前的stid._id值,这可能导致权限验证失败。

建议的解决方案:

  1. 在update权限中使用where条件来确保数据安全,而不是依赖doc对象
  2. 或者将权限逻辑改为基于固定字段的验证,避免依赖可能被修改的关联字段

例如:

"update": "auth.uid in resource.write.orders"
回到顶部