创建新的基于角色的访问控制条件
基于角色的访问控制 (RBAC) 是一种限制某些用户访问的方法。在 Strapi 应用程序中,管理面板的用户是管理员。他们的角色和权限是 在管理面板中配置的。
声明新条件
将单个条件声明为对象,将多个条件声明为对象数组。每个条件对象可以有 5 个可能的属性:
displayName
(string):管理面板中显示的条件名称,name
(string):条件名称,短横线格式,category
(string,optional):条件可以分组为 在管理面板中 中可用的类别;如果未定义,条件将出现在“默认”类别下,plugin
(字符串,可选):如果条件是由插件创建的,则应为插件的名称,以 kebab 开头(例如content-manager
),handler
:用于验证条件的函数(请参阅 使用条件处理程序)
在 ./src/index.js
中的全局 bootstrap
函数 中声明和注册条件(请参阅 注册条件)。
条件 name
属性充当其命名空间中的唯一 ID,如果定义了 plugin
属性,则为插件,否则为根命名空间。
使用条件处理程序
条件可以应用于任何权限,条件“处理程序”用于验证条件。“处理程序”是一个返回查询对象或布尔值的函数。
查询对象可用于验证您读取、创建、更新、删除或发布的实体的条件。它们使用 sift.js 库,但仅支持以下运算符:
$or
$and
$eq
$eqi
$ne
$in
$nin
$lt
$lte
$gt
$gte
$exists
$elemMatch
条件“处理程序”可以是同步或异步函数:
- 接收发出请求的经过身份验证的用户,
- 并返回“true”、“false”或查询对象。
返回“true”或“false”对于验证外部条件或经过身份验证的用户的条件很有用。 例如,仅当服务器时间是下午 5 点时才允许访问管理面板中的页面的条件可以使用此处理程序:
js
handler: () => new Date().getHours() === 17
handler
函数接收经过身份验证的用户,因此它可以验证用户的条件:
js
const condition = {
displayName: '来自 strapi.io 的电子邮件地址',
name: 'email-strapi-dot-io',
async handler(user) {
return user.email.includes('@strapi.io')
},
}
为了进行更精细的控制,handler
函数还可以返回查询对象:
js
const condition = {
displayName: 'price greater than 50',
name: 'price-gt-50',
async handler(user) {
return { price: { $gt: 50 } }
},
}
注册条件
要在管理面板中可用,应在 ./src/index
中的全局 bootstrap
函数 中声明和注册条件。使用 conditionProvider.register()
方法注册单个条件:
js
./src/index.js
js
module.exports = async () => {
await strapi.admin.services.permission.conditionProvider.register({
displayName: 'Billing amount under 10K',
name: 'billing-amount-under-10k',
plugin: 'admin',
handler: { amount: { $lt: 10000 } },
})
}
要注册多个条件(定义为 条件对象 数组),请使用 conditionProvider.registerMany()
:
js
./src/index.js
js
const conditions = [
{
displayName: 'Entity has same name as user',
name: 'same-name-as-user',
plugin: 'name of a plugin if created in a plugin',
handler: (user) => {
return { name: user.name }
},
},
{
displayName: 'Email address from strapi.io',
name: 'email-strapi-dot-io',
async handler(user) {
return user.email.includes('@strapi.io')
},
}
]
module.exports = {
async bootstrap(/* { strapi } */) {
// do your boostrap
await strapi.admin.services.permission.conditionProvider.registerMany(conditions)
},
}