基于角色的受限内容,带有无头 CMS,没有内置本地成员

Role based restricted content with a headless CMS without native members built in

来自 Umbraco,我们有 User/UserGroup(后台)和 Member/MemberGroup(网站的正面部分)的概念,我发现有点难以弄清楚如何使用无头 CMS 保护网站正面部分的内容,例如 Contentful,它没有成员的概念,也没有任何针对正面内容的本地内置处理。

在 Umbraco 中,您只需创建您的成员,将他们分配给 MemberGroups,然后让这些 MemberGroups public 访问某些内容。那么这段内容将不再public只提供给特定会员组的注册会员。

是否有一些资源 - 文章或视频 - 你可以 link 我,它描述了如何使用 Contentful 或类似的 headless 来限制对网站正面部分的某些页面或内容的访问没有内置本地成员的 CMS?

假设我需要制作一个非常简单的 React 单页应用程序 (SPA),它具有:

这在许多 CMS 甚至无头 CMS 中都是微不足道的,例如内置了对本地成员支持的 Umbraco Heartcore 和 membergroups/roles/permissions。

在 Sitecore 中,它只是为用户添加正确的域“extranet”。

但是如何使用只处理 roles/permissions 管理内容的内容或其他无头 CMS 来完成这个简单的任务,但通过不受保护的内容交付 api 公开所有内容而没有可能限制特定内容?

我能看到的一个解决方案是,如果有某种系统订阅了内容交付 api,然后该系统将用于将用户配置文件 role/group 映射到内容。但是我找不到这样的系统。

更新:如果你还可以告诉我如何制作一个类似 Intranet 的网站,就像你可以使用许多其他处理前端访问内容的 CMS 一样。

这里的问题是你想如何为这种情况设置你的解决方案设计,你显然有多种方法来解决这个问题。让我概述一些我经常应用于业务案例的选项。

请注意,选项 1 和 2 在演练中具有上下文目的。


我现在应该注意到,Contentful 的企业版可以选择创建 custom roles and permissions. You would i.e. be able to restrict or allow read rights for specific content spaces

但是嘿,因为我们都是沙盒账单的保管人,让我们继续讨论吧!


让我从以下开始:

Headless CMS provider Contentful and similar headless CMS providers are exposing content data via their content delivery api's (CDAs). This means that your content can be fetched by a client with a valid access token.

Contentful 已实施 Oauth2.0 authorization protocol. You can follow the documentation 授权您的(机器)客户端并实施 CDA 身份验证。

选项 1 - 无用户管理

第一个选项是不实施任何用户管理或基于角色的方法的解决方案设计,只是通过提供属于特定 environment 的有效访问令牌来与 CDA 联系space 并获取内容。

正如您所想象的那样,这不是一个更好的选择,因为我们必须在客户端共享访问令牌。在单页应用程序 (SPA) 的情况下,任何人都可以获得此令牌并滥用您的 CDA。


选项 2 - 同构授权

另一种选择是使用一种 isomorphic 授权形式。这意味着 SPA 根据提供的用户属性确定用户角色。然后 SPA 根据角色呈现它的 Web 组件。

在这种情况下,您显然需要某种形式的用户管理服务来跟踪您的用户和(角色)属性。

我最喜欢的简单 SPA 用户目录管理服务之一是 AWS Cognito which uses the AWS Amplify framework to use the Cognito based authentication in your React app. Want to know how to set this up? Check out this cool tutorial

好了,现在你已经在你的SPA中实现了用户管理。现在您需要确保您的用户根据他们的角色获得正确的内容。 CASL这样的同构授权包就是从这里入圈的。

CASL 实施基于角色的组件访问,确保我们的用户只能查看允许 he/she 查看的组件。在这些组件中,您可以获取特定内容。另见 CASL React documentation.

现在您可以使用两种方法来提供访问令牌:

  1. 您在 space 中为一个特定环境使用通用访问令牌,该环境包含您的所有 Web 应用程序内容,如第一个选项。您只是在使用同构授权。
  2. 您正在将特定于用户角色的访问令牌存储为用户属性,以确保用户只能请求特定环境的内容 he/she 允许从中请求内容。与同构方法一起,您有一个 2 层授权方法来获取内容。

但是在这两种情况下,在 SPA 中,如果 he/she 有点技术头脑并且能够滥用您的 API,您的用户将能够检索访问令牌。那还是不太舒服!


选项 3 - 请求验证

还在吗?让我们来看看大手笔以获得更安全的方法。

在这种情况下,您将使用用户请求验证来确保特定用户只能看到 he/she 允许看到的内容,并且不能滥用您的 CDA。

首先,您需要确保设置用户管理服务以在您的 Web 应用程序中对您的用户进行身份验证。同样,AWS Cognito 可能是一个不错的选择!但是那里还有更多服务,例如 Auth0

然后您需要设置您自己的 API 网关,您的 Web 应用程序的客户端将与其交互而不是 CDA。在此 API 网关上,您可以实施请求验证以验证是否允许用户发出特定的 API 请求。

Here is a tutorial to implement this workflow for an AWS API Gateway + AWS Cognito 设置。当客户端登录您的前端 Web 应用程序时,它会收到一个令牌。对于客户端对您的 API 网关进行的每个 API 调用,请求 header 中都会提供此令牌。如果用户可以发出此请求,验证服务会检查每个请求。

请求通过验证后,API 网关将请求代理到事件处理程序。此事件处理程序从请求中获取用户属性,并根据用户属性(即角色)与为此属性配置的特定内容环境(即角色)之间的映射,检查是否允许用户请求特定内容资产.

事件处理程序然后通过与 CDA 交互并将其返回给客户端来请求特定的内容资产。

为了实现事件处理程序,我建议使用 AWS Lambda,因为它与 AWS API 网关无缝集成。

就是这样,现在您已经实现了一种安全的方式来提供基于角色的内容。

您可以通过 c 优化您的实现结合选项 2 和选项 3,根据我的经验,这样的实现在基于角色的应用程序组件服务方面做得非常好。

您可以选择集成 Contentful 企业版,您甚至可以使用 embargoed assets 通过签署资产 URL 进一步限制 public 对内容的访问。

而且,如果您想以更便宜的方式使用签名资产 URL 的超酷功能、高可用性和其他超酷的内容分发网络功能;看看 AWS CloudFront 作为您的内容管理系统,而不是 Contentful。

奖励:您想从教程开始使用上述一些技术构建完整的 Intranet 吗?查看 this tutorial 开始。

AWS 唯一选项

根据讨论,您还可以创建一个仅限 AWS 的解决方案,您可以在其中利用各种强大的资源集成。

在这种情况下,您可以使用 AWS Amplify as your deployment provider, see this tutorial 查看如何使用 Amplify 和 CloudFront 设置 React Web 应用程序。

如前所述,您可以利用 AWS Cognito 进行用户管理,并使用 Lambda authorizer.

验证对 API 网关的请求

您可以将您的请求代理到 Lambda 事件处理程序,并从 S3 或 CloudFront 请求私有内容。我建议使用签名 URL 设置,您可以检查 S3 和 CloudFront 签名 URLs here.

之间的区别