控制对数据的访问

Objective

After completing this lesson, you will be able to 通过注释限制对资源的访问

限制

验证和授权

关于应用程序安全性,验证和授权的概念起着至关重要的作用。

观看视频以获取验证和权限的概览。

我们尚未在应用程序中配置任何权限。这意味着当前没有限制,并且所有请求仍具有整个应用程序的完全访问权限。在本课中,我们将学习如何限制对应用程序的访问。

在生产环境中,默认情况下会验证所有端点,即使未配置任何限制。验证方法可自由定制。为方便起见,支持一组开箱即用的验证方法,以涵盖最常见的场景。如果出于业务原因需要向匿名用户公开开放端点,则必须采取附加措施。本课程不涉及为生产环境配置验证。

正如我们所看到的,在开发环境中测试应用程序时不需要验证。稍后,我们将了解如何为测试环境配置验证。

关注点分离

在下文中,我们将浏览注释,您可以使用这些注释在精细级别控制对业务数据的访问。您可以将讨论的注释直接插入到定义服务的 .cds 文件中。在我们的案例中,这将是 CatalogService 的文件 cat-service.cdsAdminService 的文件 admin-service.cds

但是,最佳做法是将权限注释存储在不同的 .cds 文件中,以将其与实际服务定义分开。这样可以使实际服务定义简明扼要,并且只关注结构。还允许您为权限模型提供单独的所有权和生命周期。

我们将遵循此最佳实践并创建单独的 .cds 文件,以建模 CatalogServiceAdminService 的访问规则。我们分别调用这些文件 cat-service-auth.cds 和 admin-service-auth.cds,并将其保存在我们项目的 srv 文件夹中,就像具有服务定义的文件一样。

注意

我们将使用的注释使运行时自动执行正确的访问控制。如果此通用实施无法满足您的需求,则还可以通过权限执行 API 实施自定义程序实施。

@readonly 以及 @requires

首先,让我们查看 cat-service-auth.cds 文件,我们使用该文件控制对 CatalogService 的访问(请参阅下图)。

在此文件中,我们通过 using 指令从 CatalogService 模型中导入作者和工作簿实体的定义以及 submitOrder 操作的定义。

作者Books 实体通过 annotate 指令通过 @readonly 进行注释,以便限制所有用户对只读访问的访问。

注意

@readonly 注释外,还有一个 @insertonly 注释。两个注释都会在实体级别引入访问控制。

作为访问控制的基础,您可以设计特定于应用程序的概念角色。用户可以具有多个角色,这些角色由管理用户在平台的权限管理解决方案中进行分配。

除应用程序特定的用户角色外,CAP 还支持一些预定义的所谓伪角色,例如 authenticated-user。此角色是指已成功验证的用户。

在所示示例中,@requires 注释用于控制只有经过验证的用户才能执行 submitOrder 操作。

注意

@requires 注释可用于服务级别、实体级别和操作/功能级别以相应地控制访问。

@restrict

接下来,让我们查看 admin-service-auth.cds 文件,其中包含 AdminService 的访问控制(请参阅下图)。

在此,我们首先使用 using 指令从 AdminService 模型导入要注释的定义(作者和工作簿实体)。

作者实体使用 @(requires: 'admin') 进行注释。这确定只有具有应用程序特定管理员角色的用户才能访问作者实体。

要定义 Books 实体的权限,请使用 @restrict 注释。它指定仅允许具有应用程序特定管理员角色的用户对"工作簿"实体执行"读取"、"创建"和"更新"操作。只有具有 admin 角色的用户才允许执行 DELETE 操作,此外还限制只删除库存为 0 的书。

@restrict 注释提供了一个具有任意数量的特权对象的数组,其中每个特权对象具有以下结构:

Code Snippet
1
{ grant: <events>, to: <roles>, where: <filter-condition> }

权限对象的属性定义如下:

  • grant

    特权适用的一个或多个事件(例如 READ、CREATE、UPDATE 和 DELETE)

  • to

    适用于该特权的一个或多个用户角色或伪角色(可选)

  • where

    进一步限制实例级别访问的过滤条件(可选)

如果至少满足其中一个权限,则请求会传递由特权数组组成的限制。

注意

@restrict 注释可在服务级别、实体级别和操作/功能级别用于定义权限。但是,grantwhere 属性仅支持实体,不支持服务和操作/功能。

注意

@requires@readonly 等注释只是 @restrict 的便捷快捷方式,例如:

  • @(requires: 'admin') 等同于 @(restrict: [ { grant: '*', to: 'admin' } ])
  • @readonly 与 相同 @(restrict: [ { grant: 'READ' } ])

验证

验证策略

现在,我们已了解如何借助注释定义权限,接下来我们想查看验证。成功验证用户构成了能够执行权限检查的基础。

CAP 随附许多预构建的验证策略。

在生产中,默认情况下使用 jwt 验证策略。用户身份以及分配的角色和用户属性在运行时由用户账户和验证 (UAA) 服务的绑定实例提供。此操作以传入 HTTP 请求的 Authorization 标头中的 JWT 令牌的形式完成。

在开发期间,缺省情况下使用验证策略 mocked。此验证策略使用具有预定义模拟用户的基本验证。或者,您可以通过 package.json 文件定义其他用户,如下图所示:

注意

要检查与验证相关的当前配置,请在终端的项目根中执行以下命令:

Code Snippet
1
cds env get requires.auth

对于图中显示的配置,输出还包含可用用户的列表。除预定义用户(例如 alicebob)外,该列表还包含额外配置的用户管理员目录用户。两个用户均具有密码 abcd1234。虽然 catuser 没有应用程序特定角色,但为 adminuser 分配管理员角色。

测试

模拟验证使用基本验证。因此,您可以在请求中使用具有 Basic 验证方案的 Authorization 标头进行测试。凭据以 <user>:<password> 形式指定,如以下示例所示:

Code Snippet
12
GET <service_url>/Books Authorization: Basic catuser:abcd1234

演示和练习:向 CDS 模型添加限制

注意

在练习中,在 SAP Business Application Studio 中自行执行以下演示中的分步说明。

如果成功完成,请使用上一练习使用本地化错误消息的结果作为练习的起点。或者,您还可以使用以下 GitHub 资源库中的分支 15_error_messages 作为起点:

https://github.com/SAP-samples/cap-development-learning-journey

可在 GitHub 资源库的 16_access_control 分支中找到模拟的完整实施。

有关资源库内容及其使用方法的详细信息,可在此处找到。

观看视频,了解如何向 CDS 模型添加限制。