自动
一个令人难以置信的颗粒和表达性许可框架.
开始中
启动,安装软件包!
npm install --save @cloudflare/authr
为 authr 设置对象
尽管我们使用打字机来进行js执行,但我们必须能够与js相接,我们仍然需要保证authr处理的对象有专用于它的方法,我们需要JS接口。 但是由于Javascript没有这样的东西, 我们可以使用 符号。 。 。 .
符号有很多用法,但为了奥弗尔的目的,它保证某个对象已经明确执行特定功能,专门用于奥弗尔;有点像接口! 这些符号作为导出常数供包使用.
说明:a 数量 关于这个图书馆的哲学和内部工作的重要细节都被蒙蔽了. 如果您尚未读取主要读取内容,则强烈建议您这样做: 云层/自动/README.md
获取( R)
为了在这个系统中建立一个主题(也叫"actor"),这个常数的MUST是分配给可调用函数的对象的密钥. 当函数被调用时,它必须返回一组 Rule编号.
键入界面定义是:
interface ISubject {
[GET_RULES](): Rule[];
}
在js中执行,它可能会 最终看起来像:
import { GET_RULES, Rule } from '@cloudflare/authr';
var user = {
[GET_RULES]: () => ([
Rule.allow({
rsrc_type: 'zone',
rsrc_match: [['@id', '=', '123']],
action: ['delete', 'pause']
}),
Rule.deny({
rsrc_type: 'private_key',
rsrc_match: [],
action: '*'
})
])
};
一旦你有了这个, 你刚刚设置了一个主题 在自闭症框架! 主体是系统中能够针对具体资源采取行动的实体.
资源,有 两个 在对象上执行的符号使其成为可识别的资源.
获取资源 类型
此常数 MUST 是指定用于返回识别资源类型的字符串的可调用函数的对象的密钥 。 像这样:
import { GET_RESOURCE_TYPE } from '@cloudflare/authr';
var resource = {
[GET_RESOURCE_TYPE]: () => 'zone'
};
很简单的功能,对吧? 许可框架中的“资源”是指能够采取行动的实体,例如区域(云浮对象),甚至用户.
获取资源( A)
此常数 MUST 是指定用于调用函数的对象的密钥 。 当函数被调用时,它将被赋予一个字符串参数,指定正在寻找的属性的密钥. 像这样:
import {
GET_RESOURCE_TYPE,
GET_RESOURCE_ATTRIBUTE
} from '@cloudflare/authr';
var resource = {
[GET_RESOURCE_TYPE]: () => 'zone',
[GET_RESOURCE_ATTRIBUTE]: k => {
var attr = {
'id': 123,
'type': 'full'
};
return attr[k] || null;
}
};
在对象中使用这两个常数时, 您刚刚在 authr 框架中设置了资源 !
别急! 符号像地狱一样是新的,不能被用在旧浏览器上!
嗯,是的,但有些不错的 嘘 能实现同样的目标 并不理想,但是,它得到了工作完成.
api 密码
当所有物体都已经就绪 并准备好它们的常数时, 你终于可以开始检查访问控制。 在这个框架内,只有一个方法可以做到这一点: can。 。 。 .
可([标 、[行动]、[资源]):布尔
这是自闭症的核心功能, 终极问题:"这能否 主题 执行此功能 动作 这上面 资源? 吗
为了得到这个问题的答案,我们必须把所有三个参数都通过这个功能
subjectISubject- 试图采取行动的主体(行为者)action字符串 - 正在尝试的动作resourceIResource- 受变化影响的资源
返回时 true 如果他们被允许 false 如果他们不是.
实例
import {
can
GET_RULES,
GET_RESOURCE_TYPE,
GET_RESOURCE_ATTRIBUTE,
Rule
} from '@cloudflare/authr';
var admin = {
[GET_RULES]: () => ([
Rule.allow({
rsrc_type: 'zone',
rsrc_match: [['@status', '=', 'V']],
action: '*'
})
])
};
var user = {
[GET_RULES]: () => ([
Rule.allow({
rsrc_type: 'zone',
rsrc_match: [['@id', '=', '123']],
action: ['init', 'delete']
})
])
};
var zones = {
'123': {
[GET_RESOURCE_TYPE]: () => 'zone',
[GET_RESOURCE_ATTRIBUTE]: k => {
var attr = {
'id': 123,
'status': 'V'
};
return attr[k] || null;
}
},
'567': {
[GET_RESOURCE_TYPE]: () => 'zone',
[GET_RESOURCE_ATTRIBUTE]: k => {
var attr = {
'id': 567,
'status': 'V'
};
return attr[k] || null;
}
}
};
console.log(can(admin, 'delete', zones['123'])); // => true
console.log(can(user, 'delete', zones['567'])); // => false
console.log(can(admin, 'do_admin_things', zones['123'])); // true