Comparing version 1.3.0 to 1.4.0
@@ -65,2 +65,3 @@ const Pool = require('fib-pool'); | ||
m.ACL = opts.ACL; | ||
m.OACL = opts.OACL; | ||
} | ||
@@ -67,0 +68,0 @@ |
@@ -125,3 +125,9 @@ var util = require('util'); | ||
var acl = exports.check_acl(session, act, obj.ACL, extend); | ||
var acl; | ||
var _oalc = cls.OACL; | ||
if (util.isFunction(_oalc)) | ||
_oalc = _oalc.call(obj, session); | ||
acl = exports.check_acl(session, act, _oalc, extend); | ||
if (acl === undefined) | ||
@@ -140,3 +146,9 @@ acl = exports.check_acl(session, act, cls.ACL, extend); | ||
var acl = exports.check_acl(session, act, robj.ACL); | ||
var acl; | ||
var _oalc = rcls.OACL; | ||
if (util.isFunction(_oalc)) | ||
_oalc = _oalc.call(robj, session); | ||
acl = exports.check_acl(session, act, _oalc); | ||
if (acl === undefined) | ||
@@ -143,0 +155,0 @@ acl = exports.check_obj_acl(session, act, obj, extend); |
{ | ||
"name": "fib-app", | ||
"version": "1.3.0", | ||
"version": "1.4.0", | ||
"description": "", | ||
@@ -5,0 +5,0 @@ "main": "lib/app", |
183
README.md
@@ -100,3 +100,3 @@ # fib-app | ||
其中 `id`, `updatedAt`, `createdAt` 单个字段会自动创建和修改。`createdBy` 则需要自行指定类型。 | ||
其中 `id`, `updatedAt`, `createdAt` 单个字段会自动创建和修改。`createdBy` 则需要自行指定类型。 | ||
@@ -209,4 +209,3 @@ ## 基础对象访问 API | ||
```sh | ||
curl -X GET \ | ||
http://localhost/1.0/person?where=%7B%22name%22%3A%22tom%22%7D | ||
curl -X GET http://localhost/1.0/person?where=%7B%22name%22%3A%22tom%22%7D | ||
``` | ||
@@ -216,2 +215,3 @@ `where` 的值为一个 urlencode 后的 JSON 字符串,内容为:`{"name":"tom"}` | ||
除了完全匹配一个给定的值以外,`where` 也支持比较的方式,比如包含。`where` 参数支持如下选项: | ||
| key | operation | sample | | ||
@@ -232,4 +232,5 @@ |--------------|-----------|-----------------------| | ||
| or | 或运算 | {"or":[{"name":"tom"},{"age":24}]} | | ||
#### skip 跳过记录 | ||
通过 `skip` 选项,可以跳过指定的记录数,达到翻页的效果。 | ||
通过 `skip` 选项,可以跳过指定的记录数,达到翻页的效果。 | ||
```sh | ||
@@ -239,3 +240,3 @@ curl -X GET http://localhost/1.0/person?skip=100 | ||
#### limit 跳过记录 | ||
通过 `limit` 选项,可以限制返回记录数,`limit` 的有效数字为 1-1000,缺省为 100。 | ||
通过 `limit` 选项,可以限制返回记录数,`limit` 的有效数字为 1-1000,缺省为 100。 | ||
```sh | ||
@@ -245,3 +246,3 @@ curl -X GET http://localhost/1.0/person?limit=100 | ||
#### order 指定排序方式 | ||
通过 `order` 选项,设定返回结果集的排序方式,字段名前包含 `-` 时为倒序。 | ||
通过 `order` 选项,设定返回结果集的排序方式,字段名前包含 `-` 时为倒序。 | ||
```sh | ||
@@ -271,5 +272,21 @@ curl -X GET http://localhost/1.0/person?order=-id | ||
``` | ||
## 建立扩展对象 | ||
通过 orm 定义 hasOne 和 hasMany,可以定义对象之间的关联关系,并在 API 上体现出来,例如: | ||
```JavaScript | ||
module.exports = db => { | ||
var Person = db.models.person; | ||
var Pet = db.define('pet', { | ||
name: String | ||
}); | ||
Person.hasMany('pets', Pet); | ||
}; | ||
``` | ||
## 扩展对象访问 API | ||
| url | method | action | | ||
|----------------------------------|--------|---------------| | ||
下面是扩展对象的 API 定义: | ||
| url | method | action | | ||
|--------------------------------------|--------|---------------| | ||
| /1.0/:className/:id/:extendName | PUT | 设置扩展对象 | | ||
@@ -282,4 +299,47 @@ | /1.0/:className/:id/:extendName | POST | 创建扩展对象 | | ||
### 设置扩展对象 | ||
设置扩展对象是将两个独立的对象建立联系。比如 tom 领养了一只叫 cat 的宠物,可以用下面的操作实现: | ||
```sh | ||
curl -X PUT \ | ||
-H "Content-Type: application/json" \ | ||
-d '{"id": "57fbbdb0a2400007"}' \ | ||
http://localhost/1.0/person/57fbbdb0a2400000/pets | ||
``` | ||
在调用里需要在 body 内指定 cat 的 id。 | ||
### 创建扩展对象 | ||
直接创建扩展对象,可以在创建对象的同时,建立对象之间的联系。比如: | ||
```sh | ||
curl -X POST \ | ||
-H "Content-Type: application/json" \ | ||
-d '{"name": "cat"}' \ | ||
http://localhost/1.0/person/57fbbdb0a2400000/pets | ||
``` | ||
将创建一只名叫 cat 的宠物,并建立与 tom 的关联关系。 | ||
### 读取扩展对象 | ||
读取扩展对象与读取基础对象很相似,也同样支持 keys 选项: | ||
```sh | ||
curl -X GET http://localhost/1.0/person/57fbbdb0a2400000/pets/57fbbdb0a2400007 | ||
``` | ||
### 修改扩展对象 | ||
读取扩展对象与读取基础对象很相似: | ||
```sh | ||
curl -X PUT \ | ||
-H "Content-Type: application/json" \ | ||
-d '{"name": "cat 1"}' \ | ||
http://localhost/1.0/person/57fbbdb0a2400000/pets/57fbbdb0a2400007 | ||
``` | ||
### 删除扩展对象 | ||
删除扩展对象不会删除对象本身,只会解除对象之间的关系: | ||
```sh | ||
curl -X DETELE http://localhost/1.0/person/57fbbdb0a2400000/pets/57fbbdb0a2400007 | ||
``` | ||
### 查询扩展对象列表 | ||
查询扩展对象列表与查询基础对象列表很相似,也同样支持 keys 以及条件过滤等选项: | ||
```sh | ||
curl -X GET http://localhost/1.0/person/57fbbdb0a2400000/pets | ||
``` | ||
## ACL | ||
可以通过定义 Model 的 ACL 控制数据权限,根据需求可以精确到对象属性级别的控制。比如: | ||
可以通过定义 Model 的 ACL 控制数据权限。比如: | ||
```JavaScript | ||
@@ -294,13 +354,16 @@ const orm = require('fib-orm'); | ||
}, { | ||
ACL: { | ||
'*': { | ||
'read': ['title', 'detail'] | ||
ACL: function(session) { | ||
return { | ||
"*": { | ||
"*": false | ||
}, | ||
'role:user': { | ||
'create': true | ||
"57fbbdb0a2400000": { | ||
"*": true | ||
}, | ||
"roles": { | ||
"user": { | ||
"read": true | ||
} | ||
} | ||
":owner": { | ||
'read': true, | ||
"write": true | ||
} | ||
}; | ||
} | ||
@@ -310,4 +373,86 @@ }); | ||
``` | ||
定义了一个 Model,只允许 user 用户组的用户创建,作者本人可以读取所有字段,而其它任何人只允许读取 `title` 和 `detail` 两个字段。 | ||
如果定义 Model 时未指定 ACL,则等同于设定了缺省权限: | ||
```JavaScript | ||
{ | ||
"*": { | ||
"*": true | ||
} | ||
} | ||
``` | ||
### 主体 | ||
ACL 主体描述有三种,用户 `id`,用户 `role` 和 `*`,`id` 表示一个具体的用户,`role` 表示具有某个角色的用户,`*` 表示所有用户: | ||
| 主体 | 描述 | 优先级 | | ||
|-------|-------------|-------| | ||
| id | 具体用户的 id | 1 | | ||
| role | 用户组名 | 2 | | ||
| * | 全体 | 3 | | ||
在检查权限时,首先会匹配 `id` 对应的权限,如果未指定,则匹配用户 `role` 对应的权限,如果仍为指定,则查看是否指定了 `*` 的权限,如果 `*` 也未指定,则没有权限。 | ||
比如上面的权限配置,指定了 `user` 用户组可以阅读,用户 `57fbbdb0a2400000` 拥有全部权限,而其它用户没有任何权限。 | ||
### 权限 | ||
ACL 根据 API 行为将权限分类五种: | ||
| 权限 | 描述 | 允许类型 | | ||
|--------|------------|----------------------| | ||
| create | 创建对象 | true / false / array | | ||
| read | 读取对象 | true / false / array | | ||
| write | 修改对象 | true / false / array | | ||
| delete | 删除对象 | true / false | | ||
| find | 查询对象列表 | true / false | | ||
| * | 匹配所有权限 | true / false / array | | ||
权限制定 `true` 为允许访问,为 `false` 为禁止访问,为 `array` 为只允许指定的字段的访问。`delete` 和 `find` 不接受 `array`,如果设置了 `array` 则视同为 `true`。如果指定的权限不存在,则匹配同主体下的 `*` 权限。若都不存在,再一次查询下一优先级的主体。 | ||
比如以上例子,如果需要设定 `user` 只允许读取 `title` 和 `detail`,其他人可以读取 `title`,则可以这样设定: | ||
```JavaScript | ||
{ | ||
"*": { | ||
"*": false, | ||
"read": ['title'] | ||
}, | ||
"57fbbdb0a2400000": { | ||
"*": true | ||
}, | ||
"roles": { | ||
"user": { | ||
"read": ['title', 'detail'] | ||
} | ||
} | ||
} | ||
``` | ||
### 对象权限 | ||
在 Model 上设定的是整个类的权限,如果需要对具体的对象设定权限,可以通过设置 OACL 来实现: | ||
```JavaScript | ||
module.exports = db => { | ||
db.define('person', { | ||
name: String, | ||
sex: ["male", "female"], | ||
age: Number | ||
}, { | ||
ACL: function(session) { | ||
return { | ||
"*": { | ||
"*": false | ||
} | ||
} | ||
}, | ||
OACL: function(session) { | ||
var _acl = {}; | ||
if(this.id === session.id) | ||
_acl[session.id] = { | ||
"*": true | ||
}; | ||
return _acl; | ||
} | ||
}); | ||
}; | ||
``` | ||
在这个例子中,当访问者是对象本人时,将被允许全部操作,否则禁止一切访问。 | ||
## Function | ||
@@ -314,0 +459,0 @@ 可以为 Model 定义 api,对于复杂数据操作,可以通过自定义 Function 来完成。 |
@@ -7,3 +7,3 @@ * 重写用例,用例独立运行, uuid | ||
* relation 创建 | ||
* relation createdBy 优化测试 | ||
* relation createBy 优化测试 | ||
@@ -10,0 +10,0 @@ * create relation 自动创建 |
59245
1322
452
17