访问控制

访问控制(Access Control)决定了用户可以对任何给定文档执行哪些操作,以及他们在Admin Panel中可以看到哪些内容。通过实现访问控制,你可以基于用户、他们的角色(RBAC)、文档数据或应用程序所需的任何其他标准来定义细粒度的限制。

访问控制函数的作用域限定于_操作_,这意味着你可以为createreadupdatedelete等操作设置不同的规则。访问控制函数会在任何更改发生之前和任何操作完成之前执行。这使你能在满足请求之前确定用户是否具有必要的权限。

访问控制有许多应用场景,包括:

  • 允许任何人read所有文章
  • 仅当status字段等于published时才允许公开访问文章
  • 仅授予role字段等于admin的用户删除文章的权限
  • 允许任何人提交联系表单,但只允许已登录用户readupdatedelete这些表单
  • 限制用户只能查看自己的订单,而不能查看他人的订单
  • 允许属于特定组织的用户只能访问该组织的资源

Payload 中有三种主要的访问控制类型:

默认访问控制

Payload 提供了默认的访问控制功能,无需额外配置即可通过身份验证保护你的数据安全。Payload 通过设置一个默认函数来实现这一点,该函数仅检查请求中是否存在用户。你可以根据需要定义自己的访问控制函数来覆盖这一默认行为。

以下是 Payload 提供的默认访问控制:

const defaultPayloadAccess = ({ req: { user } }) => {
  // 如果找到用户则返回 `true`
  // 如果用户为 undefined 或 null 则返回 `false`
  return Boolean(user) // highlight-line
}

重要提示:本地 API中,默认情况下会_跳过_所有访问控制。这使得你的服务器能够完全控制应用程序。如需重新启用访问控制,可以在请求中将 overrideAccess 选项设置为 false

访问操作

Admin Panel 会根据你对访问控制(Access Control)的修改做出动态响应。例如,如果你将 ExampleCollection 的编辑权限限制为仅限具有"admin"角色的用户,Payload 会将该 Collection 完全隐藏在 Admin Panel 之外。这一功能非常强大,让你能够使用与保护 API 相同的函数来控制用户在 Admin Panel 中的操作权限。

为实现这一功能,Payload 提供了 Access Operation。在用户登录时,Payload 会在顶层执行所有 Collection、Global 和 Field 的访问控制函数,并返回一个响应,反映当前认证用户在你的应用中能够执行的操作。

重要提示: 当你的访问控制函数通过 Access Operation 执行时,iddata 参数会是 undefined。这是因为 Payload 执行这些函数时并不引用特定文档。

如果你的访问控制函数中使用了 iddata,请确保先检查它们是否已定义。如果未定义,则可以认为当前正在通过 Access Operation 执行访问控制,仅用于确定用户在 Admin Panel 中的权限。

特定语言环境的访问控制

要实现特定语言环境的访问控制,你可以在访问控制函数中使用 req.locale 参数。该参数允许你评估请求的当前语言环境,并据此确定访问权限。

以下是一个示例:

const access = ({ req }) => {
  // 如果语言环境是'en'则授予访问权限
  if (req.locale === 'en') {
    return true
  }

  // 拒绝所有其他语言环境的访问
  return false
}