阻止未经授权访问数据
学习目标
创建权限字段和权限对象。
实施 CDS 访问控制
权限对象和权限字段

在开发数据模型时,还应考虑如何保护数据免受未经授权的访问。在此学习之旅的早期,您了解到权限对象构成了用户特定、基于角色的权限控制的基础。为了保护您的数据免受未经授权的写入访问,使用关键字 AUTHORITY-CHECK 在 ABAP 代码中实施权限检查。为防止未经授权的读取访问,应首先选择使用 CDS 访问控制。
权限对象最多可分组十个相关的权限字段,应一起检查。权限字段是单独的开发对象。同一权限字段可由多个权限对象引用。
权限字段通过数据元素进行类型化。通常,数据元素或其使用的域提供权限字段与其保护的数据之间的连接。
数据模型是否需要自己的权限对象或是否使用现有权限对象,在很大程度上取决于数据模型与现有数据的独立程度。
如果数据连接到现有数据模型,则始终值得搜索现有权限对象。
提示
使用数据库表中使用的数据元素的使用位置清单开始搜索,以查看是否存在相关权限字段。

通常,在创建新权限对象之前,首先创建一个或多个新权限字段。
权限字段名称限制为 10 个字符。
请注意,您必须从一开始就指定现有数据元素。在此示例中,使用数据元素 Z00_DEPARTMENT_ID 创建权限字段 Z00DEPMENT。
在权限字段的维护对话框中,建议您指定检查表。检查表是一个数据库表,其中包含权限字段 允许的值。根据您的数据模型,这将是定制表或含主数据的表。在此示例中,我们使用部门的主数据表。
对于新创建的权限字段,抬头或问题视图中的警告会告诉您尚未使用该权限字段。下一步操作中的链接*?*部分用作此警告的快速修复。在此,您可以将权限字段添加到现有权限对象,或为其创建新的权限对象。

创建新权限对象时,必须照常提供名称和描述。此名称也限制为 10 个字符。
注意
对象类定义权限组对象。您是否可以分配对象类,取决于您开发的平台。在 SAP BTP ABAP 环境中,所有权限对象当前只有一个对象类 (CPAE)。
缺省情况下,任何新权限对象都包含权限字段 ACTVT。此字段用于区分具有标准化值的各种数据操作。
缺省情况下,权限对象考虑活动创建(值 "01")、读取(值 "03"、更新(值 "02")和删除(值 "06")。您可以移除不需要的活动,并从大型可用活动池中添加更多活动。将光标置于输入字段中,然后按 **Ctrl + 空格**键显示可用活动的列表。
注意
在极少数情况下,甚至可以完全移除权限字段 ACVT。仅当权限检查与执行的操作无关时才应执行此操作。
要添加更多权限字段,请将光标置于输入字段中并按 **Ctrl + 空格**键以显示可用权限字段的列表。
提示
不必激活权限字段和权限对象。保存即可。
如何创建权限对象
播放视频,了解如何创建权限对象。
视频:本节含 SAP 官方视频(视频 ID
1_6z9cc7p9),需在 learning.sap.com 在线观看。
资源库对象 CDS 访问控制

在此学习之旅的早期,您了解到 CDS 访问控制用于根据权限过滤数据集。让我们回顾一下基本原则:
CDS 访问控制类型的资源库对象使用关键字 DEFINE ROLE 定义 CDS 角色。在角色中,关键字 GRANT SELECT ON 将 CDS 角色与 CDS 实体相关联 - 例如,CDS 视图,在关键字 WHERE 之后,它定义了一个或多个访问条件。每当 ABAP 代码访问 CDS 实体时,数据库接口都会根据这些访问条件过滤选择结果。
仅当直接从 ABAP 代码访问 CDS 实体时,CDS 访问控制才有效。如果间接访问 CDS 实体(例如,通过其他 CDS 实体),则会将其忽略。

让我们看一下这个示例:CDS 访问控制 R_EMPLOYEE 包含 CDS 角色 R_Employee 的定义。它通过基于用户权限(PFCG 条件)的访问条件限制对 CDS 视图实体 R_Employee 的访问。
访问条件

CDS 访问控制支持各种类型的访问条件。最重要的访问条件如下:
文字条件
文字条件(也称为简单条件)将 CDS 实体的元素与固定值进行比较。文字条件是访问条件的最简单形式。它们不取决于当前用户。因此,它们通常与其他类型的访问条件相结合。
PFCG 条件
PFCG 条件 - 也称为 PFCG 方面 - 将 CDS 实体的元素与 SAP 权限概念(基于权限对象)中的权限相关联。PFCG 条件是直接从数据库表中读取的 CDS 实体的最常见访问条件。
继承条件
继承条件应用另一个 CDS 角色中的条件。继承条件是从其他 CDS 实体(视图上的视图)读取的 CDS 视图的常规访问条件。

让我们看一下一些简单条件的示例。
第一个示例是文字条件。它指定视图元素 DepartmentId 的值必须等于 'ADMIN',换句话说,对相关 CDS 实体的读取访问仅返回属于部门 ADMIN 的数据集。
第二个示例也是简单的访问条件,但不是文字。访问条件将视图元素 CreatedBy 链接到当前用户的用户名。对相关 CDS 实体的读取访问仅返回当前用户自己创建的数据集。
第三个示例说明您可以使用逻辑运算符 AND 和 OR 组合不同的访问条件。在此,条件与 OR 连接,这意味着用户可以查看自己创建的所有数据集,无论其所属的部门如何。从其他用户创建的数据集中,他们只能看到属于部门 ADMIN 的数据集。
提示
基于模板使用简单条件定义角色创建 CDS 访问控制时,您将获得一个文字条件和一个用户方面条件的基本结构。
示例:PFCG 条件
仅具有简单访问条件的 CDS 角色并不常见。如果完全使用,则将简单条件与其他访问条件(例如 PFCG 条件)组合。PFCG 条件将一个或多个视图元素链接到当前用户主数据中的权限。
播放视频以查看具有 PFCG 条件和继承条件的 CDS 角色的示例。
视频:本节含 SAP 官方视频(视频 ID
1_gv367ssi),需在 learning.sap.com 在线观看。
CDS 访问控制创建

要创建新的 CDS 访问控制,请执行以下操作:
在项目浏览器 中,找到包含要为其提供访问规则的 CDS 实体定义的数据定义。
右键单击数据定义并选择 新建访问控制 。

为特定 CDS 实体创建访问控制时, 受保护实体 输入字段已包含此 CDS 实体的名称。输入新访问控制的名称和描述,然后选择 下一步 。
注意
强烈建议访问控制和受保护实体具有相同的名称。
根据所需的访问条件类型,选择以 定义角色 开头的其中一个模板。然后选择 完成 。

如何实施 CDS 访问控制
播放视频以了解如何实施 CDS 访问控制。
视频:本节含 SAP 官方视频(视频 ID
1_p45lbnzp),需在 learning.sap.com 在线观看。
创建权限对象和 CDS 访问控制
您已开发包含数据库表和 CDS 视图实体的数据模型。要保护数据免受未经授权的访问,请定义权限字段和权限对象。然后为 CDS 视图实体创建 CDS 访问控制。
模板:
不适用
解决方案:
/LRN/DPMNT(权限字段)
/LRN/DPMNT(权限对象)
/LRN/R_DEPARTMENT_AUT(访问控制)
/LRN/R_EMPLOYEE_AUT(访问控制)
/LRN/C_DEPARTMENT_AUT(访问控制)
/LRN/C_EMPLOYEE_AUT(访问控制)
前提条件
在本练习中,您需要在之前的练习中创建的 CDS 视图实体(建议名称为:Z##_R_Department、Z##_R_Employee、Z##_C_DepartmentQuery 和 Z##_C_EmployeeQuery,其中 ## 是您的组编号)。如果尚未完成这些练习,请从包 /LRN/S4D430_EXERCISE 创建以 _AUT 结尾的四个数据定义的副本。
任务 1: 定义权限对象
根据相关部门(建议名称:Z##DPMENT,其中 ## 是您的组编号)定义权限对象以控制对员工和部门数据的访问。使用两个权限字段定义权限对象:基于部门标识的数据元素(建议名称为 Z##_DEPARTMENT_ID)的新权限字段(建议名称:Z##DPMNT),以及具有缺省允许活动的标准权限字段 ACTVT。
注意
如果尚未为部门标识创建数据元素,请改用 /LRN/DEPARTMENT_ID 数据元素。
步骤
根据部门标识的数据元素(建议名称:
Z##DEPMENT)创建权限字段。在项目浏览器中,右键单击包以打开上下文菜单,然后选择 新建→其他 ABAP 资源库对象 。
在过滤器字段中,输入
au并从建议清单中选择权限字段。输入
Z##DPMNT作为名称,输入Z##_DEPARTMENT_ID作为数据元素。然后选择下一步。确认传输请求并选择完成。
将部门数据的数据库表设置为检查表(建议名称为
Z##DEPMENT)并保存权限字段。
注意
如果您的权限字段基于 /LRN/DEPARTMENT_ID 数据元素,则必须使用数据库表 /LRN/DEPMENT_REL。
将光标置于检查表字段中,输入
Z##并按 **Ctrl + 空格**打开值帮助。从值帮助中选择 Z##DEPMENT。
按
Ctrl + S保存权限字段。创建新的权限对象并为其分配权限字段 。
在权限字段的定义中,向下滚动至下一步是什么?部分,然后选择创建新的权限对象并为其分配权限字段。
输入
Z##DPMNT作为 名称 ,输入每个部门的权限作为 描述 ,然后选择 下一步 。确认传输请求并选择完成。
确认新权限对象包含标准权限字段
ACTVT和缺省允许的活动。检查应包含您自己的权限字段和缺省权限字段 ACTVT 的权限字段部分。
检查应包含四个缺省活动的允许的活动部分。
保存权限对象。
按
Ctrl + S保存权限对象。
任务 2: 定义访问控制
为基本视图实体定义访问控制,即部门数据的基本视图实体(建议名称为 Z##_R_Department)和员工数据的基本视图实体(建议名称为 Z##_R_Employee)。使用模板,该模板允许您根据刚创建的权限对象控制访问。
注意
按照常规建议,在其保护的视图实体之后命名访问控制。
步骤
在数据预览工具中打开部门数据的基本视图实体。
打开视图实体的定义,然后按
F8打开数据预览工具。对于此视图实体,创建使用 PFCG 条件定义 CDS 角色的 CDS 访问控制。
在项目浏览器中,找到 CDS 数据定义
Z##_R_DEPARTMENT。右键单击数据定义以打开上下文菜单,然后选择新建访问控制。
将名称从受保护实体字段复制到名称字段。
在描述字段中,输入**
部门(访问控制)**,然后选择下一步。确认传输请求,然后选择下一步。
从模板列表中,选择使用 PFCG 方面定义角色,然后选择完成。
在生成的代码中,引用权限对象。
如下调整代码:
define role Z##_R_DEPARTMENT
{
grant select on Z##_R_Department
where (entity_element_1, entity_element_2)
= aspect pfcg_auth(
Z##DPMNT,
authorization_field_1,
authorization_field_2,
filter_field_1 = 'filter_value_1'
);
}
注意
我们引入了额外的换行符,以提高打印培训材料的可读性。
使用权限字段的名称替换权限字段的第一个占位符。然后移除第二个占位符。
如下调整代码:
define role Z##_R_DEPARTMENT
{
grant select on Z##_R_Department
where (entity_element_1, entity_element_2)
= aspect pfcg_auth(
Z##DPMNT,
Z##DPMNT,
filter_field_1 = 'filter_value_1'
);
}
使用
ACTVT权限字段作为过滤器字段,并为其提供活动 显示 的过滤器值。如下调整代码:
define role Z##_R_DEPARTMENT
{
grant select on Z##_R_Department
where (entity_element_1, entity_element_2)
= aspect pfcg_auth(
Z##DPMNT,
Z##DPMNT,
ACTVT = '03'
);
}
参考合适的实体元素以提供第一个权限字段。然后移除第二个视图元素的占位符。
如下调整代码:
define role Z##_R_DEPARTMENT
{
grant select on Z##_R_Department
where ( Id )
= aspect pfcg_auth(
Z##DPMNT,
Z##DPMNT,
ACTVT = '03'
);
}
激活访问控制并刷新数据预览工具中的显示。
按
Ctrl + F3激活开发对象。返回到受保护实体的数据预览,然后选择刷新。
或者,可以按
F5刷新显示的数据。要查看至少一些数据,请再次编辑 CDS 访问控制,并将您自己的权限对象
Z##DPMNT替换为解决方案对象/LRN/DPMNT,并将您自己的权限字段Z##DPMNT替换为权限字段/LRN/DPMNT。对于此权限对象,您的用户已具有一些权限。返回到 CDS 访问控制的源代码。
如下调整代码:
define role Z##_R_DEPARTMENT
{
grant select on Z##_R_Department
where ( Id )
= aspect pfcg_auth(
/LRN/DPMNT,
/LRN/DPMNT,
ACTVT = '03'
);
}
激活访问控制并刷新数据预览工具中的显示。
同样,为员工数据的基础视图实体创建 CDS 访问控制。
在项目浏览器中,找到您的 CDS 数据定义
Z##_R_EMPLOYEE。右键单击数据定义以打开上下文菜单,然后选择新建访问控制。
将名称从受保护实体字段复制到名称字段。
在描述字段中,输入**
员工(访问控制)**,然后选择下一步。确认传输请求,然后选择下一步。
从模板列表中,选择使用 PFCG 方面定义角色,然后选择完成。
按如下所示调整生成的代码:
define role Z##_R_EMPLOYEE
{
grant select on Z##_R_Employee
where ( DepartmentId )
= aspect pfcg_auth(
/LRN/DPMNT,
/LRN/DPMNT,
ACTVT = '03'
);
}
激活访问控制。
按
Ctrl + F3激活开发对象。
任务 3: 定义继承访问控制
为视图实体定义访问控制,用于根据两个输入参数(建议名称为 Z##_C_EmployeeQueryP)查询员工数据。同样,为视图实体定义访问控制,用于查询每个部门的员工数据和员工数据(建议名称为 Z##_C_DepartmentQuery)。在这两种情况下,使用允许您从基础视图实体继承权限规则的模板。
注意
按照常规建议,在其保护的视图实体之后命名访问控制。
步骤
打开基于两个输入参数查询员工数据的 CDS 视图实体的定义。
按
Ctrl + Shift + A。输入要打开的 CDS 数据定义的名称,即
Z##_C_EMPLOYEEQUERYP,然后选择确定。对于具有参数的视图实体,创建一个使用继承条件定义 CDS 角色的 CDS 访问控制。
在项目浏览器中,查找 CDS 数据定义
Z##_C_EMPLOYEEQUERYP。右键单击数据定义以打开上下文菜单,然后选择新建访问控制。
将名称从受保护实体字段复制到名称字段。
在描述字段中,输入**
员工查询(访问控制)**,然后选择下一步。确认传输请求,然后选择下一步。
从模板列表中,选择使用继承的条件定义角色,然后选择完成。
在生成的代码中,引用受保护实体用作数据源的视图实体,即
Z##_R_Employee。如下调整代码:
define role Z##_C_EMPLOYEEQUERYP {
grant select on Z##_C_EmployeeQueryP
where inheriting conditions
from entity Z##_R_Employee;
}
激活访问控制。
按
Ctrl + F3激活开发对象。打开汇总每个部门的员工数据的 CDS 视图实体的定义。
按
Ctrl + Shift + A。输入要打开的 CDS 数据定义的名称,即
Z##_C_DEPARTMENTQUERY,然后选择确定。定义从主数据源继承访问条件的访问控制。
在项目浏览器中,找到 CDS 数据定义
Z##_C_DEPARTMENTQUERY。右键单击数据定义以打开上下文菜单,然后选择新建访问控制。
将名称从受保护实体字段复制到名称字段。
在描述字段中,输入**
部门查询(访问控制)**,然后选择下一步。确认传输请求,然后选择下一步。
从模板列表中,选择使用继承的条件定义角色,然后选择完成。
按如下所示调整生成的代码:
define role Z##_C_DEPARTMENTQUERY {
grant select on Z##_C_DepartmentQuery
where inheriting conditions
from entity Z##_R_Department;
}
激活访问控制。
按
Ctrl + F3激活开发对象。
