访问控制
访问控制(Access Control)决定了用户可以对任何给定文档执行哪些操作,以及他们在Admin Panel中可以看到哪些内容。通过实现访问控制,你可以基于用户、他们的角色(RBAC)、文档数据或应用程序所需的任何其他标准来定义细粒度的限制。
访问控制函数的作用域限定于_操作_,这意味着你可以为create
、read
、update
、delete
等操作设置不同的规则。访问控制函数会在任何更改发生之前和任何操作完成之前执行。这使你能在满足请求之前确定用户是否具有必要的权限。
访问控制有许多应用场景,包括:
- 允许任何人
read
所有文章 - 仅当
status
字段等于published
时才允许公开访问文章 - 仅授予
role
字段等于admin
的用户删除文章的权限 - 允许任何人提交联系表单,但只允许已登录用户
read
、update
或delete
这些表单 - 限制用户只能查看自己的订单,而不能查看他人的订单
- 允许属于特定组织的用户只能访问该组织的资源
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 执行时,id
和 data
参数会是 undefined
。这是因为 Payload 执行这些函数时并不引用特定文档。
如果你的访问控制函数中使用了 id
或 data
,请确保先检查它们是否已定义。如果未定义,则可以认为当前正在通过 Access Operation 执行访问控制,仅用于确定用户在 Admin Panel 中的权限。
特定语言环境的访问控制
要实现特定语言环境的访问控制,你可以在访问控制函数中使用 req.locale
参数。该参数允许你评估请求的当前语言环境,并据此确定访问权限。
以下是一个示例:
const access = ({ req }) => {
// 如果语言环境是'en'则授予访问权限
if (req.locale === 'en') {
return true
}
// 拒绝所有其他语言环境的访问
return false
}