基于角色的访问控制条件 (RBAC) Create new Role-Based Access Control conditions

在 Strapi 中,RBAC 是一种限制某些用户访问管理面板某些功能的方法。Strapi 社区版提供 3 个默认角色。

创建新的基于角色的访问控制条件

基于角色的访问控制 (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)
  },
}