未验证 提交 09700c10 编写于 作者: W wanganxp 提交者: GitHub

Update schema.md

上级 2ed89e96
......@@ -122,7 +122,7 @@
```
uniCloud推出了`openDB`开源数据库规范,其中的表均已经内置`DB Schema`[详见](https://gitee.com/dcloud/opendb)
uniCloud推出了`openDB`开源数据库规范,包括用户表、文章表、商品表等很多模板表,这些模板表均已经内置`DB Schema`,可学习参考[详见](https://gitee.com/dcloud/opendb)
### 默认值defaultValue/forceDefaultValue
......@@ -420,6 +420,12 @@ errorMessage支持字符串,也支持json object。类型为object时,可定
- 每个校验相关的属性不通过,可以以属性名为key配置它的错误提示语。
- 如果是扩展校验函数,可以在其内部写callback来自定义错误提示语。
**其他注意事项**
“数据库中某字段值不能在多条记录中重复”,这个需求一般不是在字段值域校验里实现,而是在数据库索引里配置该字段为唯一索引。
可以在web控制台配置索引,db_init.json也可以创建索引。注意如果数据库中多条记录中该字段已经有重复内容,那么设该字段为唯一索引时会报错,需先把重复数据去掉。
### 数据权限系统permission@permission
#### 概述
......@@ -432,7 +438,7 @@ errorMessage支持字符串,也支持json object。类型为object时,可定
只要配好`DB Schema`,放开让前端写业务即可。配置里声明不能读写的数据,前端就无法读写。
`DB Schema`的permission规则,分为两部分,一边是对数据的指定,一边是对角色的指定,规则中对两者进行关联,匹配则校验通过。
`DB Schema`的permission规则,分为两部分,一边是对操作数据的指定,一边是对角色的指定,规则中对两者进行关联,匹配则校验通过。
1. 对数据的指定
- 可以对整个表进行`增删改查`控制
......@@ -452,9 +458,9 @@ errorMessage支持字符串,也支持json object。类型为object时,可定
#### 表级权限控制
表级控制,包括增删改查四种权限,分别称为:create、delete、update、read。
表级控制,包括增删改查四种权限,分别称为:create、delete、update、read。(注意这里使用的是行业通用的crud命名,与操作数据库的方法add()、remove()、update()、get()在命名上有差异,但表意是相同的)
所有的操作的默认值均为false。也就是不配置permission代表前端不能操作数据库。
所有的操作的默认值均为false。也就是不配置permission代表前端不能操作数据库(admin用户例外)
例如一个user表,里面有_id、name、pwd等字段,该表的`DB Schema`如下,代表前端用户可读(包括游客),但前端非admin用户不可新增、删除、更新数据记录。
......@@ -573,7 +579,7 @@ permission的字段级控制,包括读写两种权限,分别称为:read、
|auth.uid |用户id |
|auth.role |用户角色数组,参考[uni-id 角色权限](/uniCloud/uni-id?id=rbac),注意`admin`为内置的角色,如果用户角色列表里包含`admin`则认为此用户有完全数据访问权限|
|auth.permission|用户权限数组,参考[uni-id 角色权限](/uniCloud/uni-id?id=rbac) |
|doc |记录内容,用于匹配记录内容/查询条件(需要注意的是,规则内的doc对象并不是直接去校验存在于数据库的数据,而是校验客户端的查询条件) |
|doc |数据库中的目标数据记录,用于匹配记录内容/查询条件(需要注意的是,规则内的doc对象并不是直接去校验存在于数据库的数据,而是校验客户端的查询条件) |
|now |当前服务器时间戳(单位:毫秒),时间戳可以进行额外运算,如doc.publish\_date > now - 60000表示publish\_date在最近一分钟 |
|action |数据操作请求同时指定的uni-clientDB-action。用于指定前端的数据操作必须同时附带执行一个action云函数,如未触发该action则权限验证失败 |
......@@ -584,13 +590,13 @@ permission的字段级控制,包括读写两种权限,分别称为:read、
|运算符 |说明 |示例 |示例解释(集合查询) |
|:-: |:-: |:-: |:-: |
|== |等于 |auth.uid == 'abc' |用户id为abc |
|!= |不等于 |auth.uid != 'abc' |用户id不为abc |
|!= |不等于 |auth.uid != null |用户要处于登录状态 |
|> |大于 |doc.age>10 |查询条件的 age 属性大于 10 |
|>= |大于等于 |doc.age>=10 |查询条件的 age 属性大于等于 10 |
|< |小于 |doc.age<10 |查询条件的 age 属性小于 10 |
|<= |小于等于 |doc.age<=10 |查询条件的 age 属性小于等于 10 |
|in |存在在数组中 |doc.status in ['a','b'] |查询条件的 status 是['a','b']中的一个,数组中所有元素类型需一致 |
|! |非 `2.0.5+` |!(doc.status in ['a','b']) |查询条件的 status 不是['a','b']中的任何一个,数组中所有元素类型需一致 |
|! |非 |!(doc.status in ['a','b']) |查询条件的 status 不是['a','b']中的任何一个,数组中所有元素类型需一致 |
|&& |与 |auth.uid == 'abc' && doc.age>10 |用户id 为 abc 并且查询条件的 age 属性大于 10 |
|&#124;&#124; |或 |auth.uid == 'abc'&#124;&#124;doc.age>10|用户Id为abc或者查询条件的 age 属性大于 10 |
......@@ -638,13 +644,25 @@ permission的字段级控制,包括读写两种权限,分别称为:read、
根据这个配置,如前端应用已经登录,且登录的用户发起修改自己的name的请求,则允许修改。其他修改数据请求则会被拒绝。
**action的说明**
**注意**
要分清 数据权限permission 和 字段值域校验validator 的区别。
在权限规则的变量中只有数据库中的数据doc,并没有前端提交的待入库数据data。所以如果要对待入库的数据data做校验,应该在字段值域validator中校验,而不是在权限permission中校验。
如果想获取和判断目标数据记录doc之外的其他数据,则需要使用get方法,见下一章节。
很多需求貌似属于 数据权限校验 ,但实际不用写权限规则:
- 例如在news表新增一条记录,权限需求是“未登录用户不能创建新闻”,其实不需要在news表的create权限里写`auth.uid != null`。只需把news表的uid字段的forceDefaultValue设为`"$env": "uid"`即可,未登录用户自然无法创建。
**变量action的说明**
action是`clientDB`的一个配套功能。它的作用是在前端发起数据操作请求时,附带一个action的name,则会同时执行一个`uni-clientDB-action`的云函数。[详见](/uniCloud/database?id=action)
有些复杂业务,要求必须同时执行一个action云函数,才能允许前端对特定数据的修改。
以user表为例,假使用户在修改name时,必须要触发一个名为changenamelog的action云函数,在该云函数里会记录一条留痕日志,如果没有记录日志则不允许修改name。那么在`DB Schema`里要配置`action == 'changenamelog'`
以user表为例,假使用户在修改自己的name时,必须要触发一个名为changenamelog的action云函数,在该云函数里会记录一条留痕日志,如果没有记录日志则不允许修改name。那么在`DB Schema`里要配置`action == 'changenamelog'`
```json
// user表的schema
......@@ -685,20 +703,43 @@ action是`clientDB`的一个配套功能。它的作用是在前端发起数据
}
```
根据这个配置,如前端应用已经登录,且登录的用户发起修改自己的name的请求,且同时前端的改库请求伴随action云函数changenamelog,则允许修改。其他修改数据请求则会被拒绝。
前端提交代码,必须带上action参数
```js
const db = uniCloud.database();
db.collection("user").action("changenamelog").doc("xxx").update({
name:"newname"
})
```
#### 权限规则内可用的方法
action云函数中记录日志的代码,此处省略。
权限规则内仅可使用get方法,作用是根据id获取数据库中的数据。get方法接收一个字符串作为参数字符串形式为`database.表名.记录ID`
根据上述配置,如前端应用已经登录,且登录的用户发起修改自己的name的请求,且同时前端的改库请求伴随action云函数changenamelog,则允许修改。其他修改数据请求则会被拒绝。
用法示例:
`action`有很多用途,有的权限规则比较复杂,需要写很多js代码,此时也可以在`action`的before中进行校验。
```js
"get(`database.shop.${doc.shop_id}`).owner == auth.uid"
但注意导出`db_init.json`时不会包含`action``action`属于云函数。导出`db_init.json`只会包含schema和validateFunction。
#### 权限规则内的数据库查询get方法
权限规则内置了doc变量,但只能用于要操作的数据表的判断,如果要获取其他表的数据做判断就需要get方法了。
权限规则内通过get方法,根据id获取数据库中的数据。get方法接收一个字符串作为参数,字符串形式为`database.表名.记录ID`
例如有个论坛,要求用户积分大于100分才可以发帖。那么帖子表的create权限应该配成:
```json
"create": get(`database.uni-id-users.${auth.uid}`).score > 100"
```
使用get方法时需要注意get方法的参数必须是唯一确定值,以上述示例为例
使用get方法时需要注意get方法的参数必须是唯一确定值,例如schema配置的get权限如下:
```json
"get(`database.shop.${doc.shop_id}`).owner == auth.uid"
```
前端js如下:
```js
// 此条件内doc.shop_id只能是'123123',可以通过get(`database.shop.${doc.shop_id}`)获取数据来进行权限验证
db.collection('street').where("shop_id=='123123'").get()
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册