Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
erosXXX
uni-app
提交
09700c10
U
uni-app
项目概览
erosXXX
/
uni-app
与 Fork 源项目一致
Fork自
DCloud / uni-app
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
U
uni-app
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
09700c10
编写于
10月 29, 2020
作者:
W
wanganxp
提交者:
GitHub
10月 29, 2020
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Update schema.md
上级
2ed89e96
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
57 addition
and
16 deletion
+57
-16
docs/uniCloud/schema.md
docs/uniCloud/schema.md
+57
-16
未找到文件。
docs/uniCloud/schema.md
浏览文件 @
09700c10
...
...
@@ -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 |
|
||
|或 |auth.uid == 'abc'
||
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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录