保护AEM Headless中的内容
从AEM Publish提供AEM Headless内容时,确保数据的完整性和安全性是提供敏感内容时至关重要的。 本操作说明如何保护AEM Headless GraphQL API端点提供的内容。
本教程中的指南对内容有严格要求,不能仅提供给特定用户或用户组。 必须区分个性化营销内容和私人内容,如PII或个人财务数据,以避免混淆和意外结果。 本教程将介绍保护私有内容的问题。
在讨论营销内容时,我们指的就是为个别用户或组定制的内容,该内容并非用于一般用途。 但是,必须了解一点,虽然此内容可能会面向某些用户,但在预期上下文之外(例如,通过操纵HTTP请求)暴露于此内容不会带来安全、法律或声誉风险。
需要强调的是,本文中所涉及的所有内容均被假定为私密内容,只能由指定的用户或组查看。 营销内容通常不需要保护,而是应用程序可以管理其提供给特定用户的内容,并缓存这些内容以提高性能。
本操作说明不包括:
- 直接保护端点,而是侧重于保护它们提供的内容。
- AEM Publish的身份验证或获取登录令牌。 身份验证方法和凭据传递取决于各个用例和实施。
用户组
首先,我们必须定义一个用户组,该用户组包含应有权访问受保护内容的用户。
{align="center"}
用户组分配对AEM Headless内容的访问权限,包括内容片段或其他引用的资源。
- 以 用户管理员 身份登录AEM作者。
- 导航到 工具 > 安全 > 组。
- 选择右上角的 创建。
- 在 详细信息 选项卡中,指定 组ID 和 组名。
- 组ID和组名称可以是任何内容,但在此示例中使用名称 AEM Headless API users。
- 选择 保存并关闭。
- 选择新创建的组,然后从操作栏中选择 激活。
如果需要各种级别的访问,请创建多个可与不同内容关联的用户组。
将用户添加到用户组
要授予AEM Headless GraphQL API请求访问受保护内容的权限,您可以将headless请求与属于特定用户组的用户相关联。 以下是两种常用方法:
-
AEM as a Cloud Service 技术帐户:
- 在AEM as a Cloud Service Developer Console中创建技术帐户。
- 使用技术帐户登录AEM Author一次。
- 通过 工具>安全>组> AEM Headless API用户>成员,将技术帐户添加到用户组。
- 在AEM Publish上 激活技术帐户用户和用户组。
- 此方法要求Headless客户端不要向用户公开服务凭据,因为它们是特定用户的凭据,不应共享。
{align="center"}
-
已命名用户:
- 对命名用户进行身份验证,并将其直接添加到AEM Publish上的用户组。
- 此方法要求Headless客户端通过AEM Publish验证用户凭据,获取AEM登录或访问令牌,并将此令牌用于后续请求AEM。 本操作方法中未涵盖有关如何实现此目标的详细信息,具体取决于实施。
保护内容片段
保护内容片段对于保护AEM Headless内容至关重要,可以通过将内容与封闭用户组(CUG)关联来实现。 当用户向AEM Headless GraphQL API发出请求时,返回的内容会根据用户的CUG进行过滤。
{align="center"}
按照以下步骤通过封闭用户组(CUG)实现此目的。
- 以 DAM用户 身份登录AEM作者。
- 导航到 Assets >文件,然后选择包含要保护的内容片段的 文件夹。 除非被其他CUG覆盖,否则CUG按层级应用,并会影响到子文件夹。
- 确保此用户组中包含属于其他利用文件夹内容的渠道的用户。 或者,在CUG列表中包括与这些频道相关联的用户组。 否则,这些渠道将无法访问内容。
- 选择文件夹,然后从工具栏中选择 属性。
- 选择 权限 选项卡。
- 键入 组名称 并选择 添加 按钮以添加新的CUG。
- 保存 以应用封闭用户组。
- 选择 资源文件夹,然后选择 Publish,将应用了CUG的文件夹发送到AEM Publish,并将评估为权限。
对包含需要保护的内容片段的所有文件夹执行这些相同步骤,将正确的CUG应用于每个文件夹。
现在,当向AEM Headless GraphQL API端点发出HTTP请求时,结果中将仅包含请求用户的指定CUG可访问的内容片段。 如果用户无法访问任何内容片段,则结果将为空,但仍返回200 HTTP状态代码。
保护引用的内容
内容片段经常引用其他AEM内容,例如图像。 要保护此引用内容,请将CUG应用于存储引用资产的资产文件夹。 请注意,通常使用与AEM Headless GraphQL API不同的方法请求引用的资源。 因此,在请求向这些引用的资产传递访问令牌的方式可能会有所不同。
根据内容体系结构,可能有必要将CUG应用于多个文件夹,以确保所有引用的内容都受到保护。
防止缓存受保护的内容
默认情况下,AEM as a Cloud Service 缓存HTTP响应以提高性能。 但是,这可能会导致提供受保护内容时出现问题。 要阻止缓存此类内容,请在AEM Publish实例的Apache配置中删除特定端点的缓存标头。
将以下规则添加到Dispatcher项目的Apache配置文件中,以删除特定端点的缓存标头:
# dispatcher/src/conf.d/available_vhosts/example.vhost
<VirtualHost *:80>
...
# Replace `example` with the name of your GraphQL endpoint's configuration name.
<LocationMatch "^/graphql/execute.json/example/.*$">
# Remove cache headers for protected endpoints so they are not cached
Header unset Cache-Control
Header unset Surrogate-Control
Header set Age 0
</LocationMatch>
...
</VirtualHost>
请注意,这将导致性能损失,因为Dispatcher或CDN不会缓存内容。 这是性能和安全性之间的权衡。
保护AEM Headless GraphQL API端点
本指南不涉及保护AEM Headless GraphQL API端点本身,而是侧重于保护它们提供的内容。 所有用户(包括匿名用户)都可以访问包含受保护内容的端点。 将仅返回可由用户的封闭用户组访问的内容。 如果没有可访问的内容,AEM Headless API响应将仍具有200 HTTP响应状态代码,但结果将为空。 通常,保护内容安全就足够了,因为端点本身不会公开敏感数据。 如果需要保护端点,请通过Sling存储库初始化(repoinit)脚本在AEM Publish上将ACL应用于这些端点。