Skip to content

集合访问控制

集合访问控制是一种用于限制对集合内文档的访问权限的访问控制方式,同时也限制用户在管理面板中查看与该集合相关内容时的可见范围(即哪些能看到,哪些看不到)。

要为一个集合添加访问控制,可以在集合配置中使用 access 属性:

javascript
import type { CollectionConfig } from 'payload'

export const CollectionWithAccessControl: CollectionConfig = {
  // ...
  access: {
    
    // ...
  },
}

配置选项

访问控制是针对请求的操作而特定设置的。

要给一个集合添加访问控制,需在你的集合配置中使用 access 属性:

typescript
import type { CollectionConfig } from 'payload';

export const CollectionWithAccessControl: CollectionConfig = {
  // ...
  access: {
    create: () => {...},
    read: () => {...},
    update: () => {...},
    delete: () => {...},

    // Auth-enabled Collections only
    admin: () => {...},
    unlock: () => {...},

    // Version-enabled Collections only
    readVersions: () => {...},
  },
}

以下是可用的选项:

功能允许 / 拒绝访问情况
create用于创建操作
read用于查找(find)和按 ID 查找(findByID)操作
update用于更新操作
delete用于删除操作

如果一个集合支持身份验证,那么有以下额外的可用选项:

功能允许 / 拒绝访问情况
admin用于限制对管理面板的访问
unlock用于限制哪些用户可以访问解锁操作

如果一个集合支持版本控制,那么有以下额外的可用选项:

功能允许 / 拒绝访问情况
readVersions用于控制谁可以读取版本,谁不可以。会自动限制管理界面的版本查看权限

创建操作

返回一个布尔值,用于允许或拒绝针对创建请求的访问。

要为集合添加创建操作的访问控制,可以在集合配置中使用 create 属性:

typescript
import type { CollectionConfig } from 'payload'

export const CollectionWithCreateAccess: CollectionConfig = {
  // ...
  access: {
    create: ({ req: { user }, data }) => {
      return Boolean(user)
    },
  },
}

以下参数会传递给 create 函数:

选项描述
req包含当前已通过身份验证用户信息的请求对象。
data用于创建文档时所传入的数据。

读取操作

返回一个布尔值,用于允许或拒绝读取请求的访问权限。

要为集合添加读取访问控制,可在集合配置中使用 read 属性:

typescript
import type { CollectionConfig } from 'payload'

export const CollectionWithReadAccess: CollectionConfig = {
  // ...
  access: {
    read: ({ req: { user } }) => {
      return Boolean(user)
    },
  },
}

TIP

返回一个查询条件(Query)可以将文档限制为仅符合该约束条件的文档。这有助于限制用户对特定文档的访问。更多详情见后文。

随着应用程序变得更加复杂,你可能希望将函数定义在单独的文件中,然后导入到集合配置里:

typescript
import type { Access } from 'payload'

export const canReadPage: Access = ({ req: { user } }) => {
  // 允许已认证的用户
  if (user) {
    return true
  }

  // 通过返回一个查询条件,访客用户可以读取公开文档
  // 注意:这假设你的集合中有一个名为 `isPublic` 的复选框字段
  return {
    isPublic: {
      equals: true,
    },
  }
}

以下参数会传递给 read 函数:

选项描述
req包含当前已认证用户的请求对象。
id如果是通过 findByID 方法请求文档,则为所请求文档的 ID。

更新操作

返回一个布尔值,用于决定是否允许对更新请求进行访问。

若要为集合添加更新访问控制,可在集合配置里使用 update 属性,示例如下:

typescript
import type { CollectionConfig } from 'payload'

export const CollectionWithUpdateAccess: CollectionConfig = {
  // ...
  access: {
    update: ({ req: { user } }) => {
      return Boolean(user)
    },
  },
}

TIP

返回一个查询条件(Query),可将文档限定为仅符合该约束条件的文档,这有助于限制用户对特定文档的访问权限,更多详情见后文。

随着应用程序复杂度增加,你可以把函数定义在单独的文件中,再导入到集合配置里,示例如下:

typescript
import type { Access } from 'payload'

export const canUpdateUser: Access = ({ req: { user }, id }) => {
  // 允许角色为 'admin' 的用户进行更新操作
  if (user.roles && user.roles.some((role) => role === 'admin')) {
    return true
  }

  // 允许其他用户仅更新自己的文档
  return user.id === id
}

以下参数会传递给 update 函数:

选项描述
req包含当前已认证用户信息的请求对象。
id要更新的文档的 ID。
data用于更新文档时所传入的数据。

删除操作

与更新函数类似,此函数返回一个布尔值或查询约束,以此限制哪些用户可以删除哪些文档。

若要为集合添加删除访问控制,可在集合配置中使用 delete 属性,示例如下:

typescript
import type { CollectionConfig } from 'payload'

export const CollectionWithDeleteAccess: CollectionConfig = {
  // ...
  access: {
    delete: ({ req: { user } }) => {
      return Boolean(user)
    },
  },
}

随着应用程序复杂度的提升,你可以将函数定义在单独的文件中,然后导入到集合配置里,示例如下:

typescript
import type { Access } from 'payload'

export const canDeleteCustomer: Access = async ({ req, id }) => {
  if (!id) {
    // 由于没有 `id` 无法确定,允许管理界面显示删除控件
    return true
  }

  // 使用 `id` 查询另一个集合
  const result = await req.payload.find({
    collection: 'contracts',
    limit: 0,
    depth: 0,
    where: {
      customer: { equals: id },
    },
  })

  return result.totalDocs === 0
}

以下参数会传递给 delete 函数:

选项描述
req带有额外 user 属性的请求对象,user 为当前已登录的用户。
id要删除的文档的 ID。

管理面板访问控制

若该集合用于访问管理面板,那么管理访问控制函数会决定当前已登录的用户是否能够访问管理界面。

要为集合添加管理访问控制,可在集合配置中使用 admin 属性,示例如下:

typescript
import type { CollectionConfig } from 'payload'

export const CollectionWithAdminAccess: CollectionConfig = {
  // ...
  access: {
    admin: ({ req: { user } }) => {
      return Boolean(user)
    },
  },
}

以下参数会传递给 admin 函数:

选项描述
req包含当前已认证用户信息的请求对象。

解锁操作

此操作用于确定哪些用户能够解锁其他可能因多次登录尝试失败而被阻止成功进行身份验证的用户。

若要为集合添加解锁访问控制,可在集合配置中使用 unlock 属性,示例如下:

typescript
import type { CollectionConfig } from 'payload'

export const CollectionWithUnlockAccess: CollectionConfig = {
  // ...
  access: {
    unlock: ({ req: { user } }) => {
      return Boolean(user)
    },
  },
}

以下参数会传递给 unlock 函数:

选项描述
req包含当前已认证用户信息的请求对象。

读取版本

如果集合启用了版本控制功能,readVersions 访问控制函数将决定当前登录用户是否可以访问文档的版本历史记录。

要为集合添加读取版本的访问控制,可在集合配置中使用 readVersions 属性,示例如下:

typescript
import type { CollectionConfig } from 'payload'

export const CollectionWithVersionsAccess: CollectionConfig = {
  // ...
  access: {
    readVersions: ({ req: { user } }) => {
      return Boolean(user)
    },
  },
}

以下参数会传递给 readVersions 函数:

选项描述
req包含当前已认证用户信息的请求对象。