关于 authorization-iam
authorization-iam 是用于在 ABAP Cloud 和本地 ABAP 系统中实现授权检查与身份访问管理的技能。它讲解不同平台的模型,包括 IAM 应用和业务角色、PFCG、CDS 访问控制及 RAP 授权。
主要功能
- 01ABAP Cloud 与经典授权模型
- 02ABAP 代码中的授权检查
- 03使用 DCL 配置 CDS 访问控制
- 04IAM 应用、目录和业务角色
- 05PFCG 角色与 RAP 授权指南
适用场景
- 01为 ABAP 平台选择授权模型
- 02用 DCL 限制 CDS 视图行
- 03配置业务角色和字段限制
- 04为 RAP 添加全局或实例授权
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ likweitan/ abap-skills --skill authorization-iam安装后在 Claude Code 中输入/authorization-iam确认已加载。
附带文件references/authorization-patterns.md
详细介绍
授权与 IAM
在 ABAP Cloud 和本地部署系统中实现授权检查和身份与访问管理的指南。
工作流
-
确定用户的目标:
- 在 ABAP 代码中实现授权检查
- 创建 CDS 访问控制(DCL)
- 设置 IAM 应用、业务目录和业务角色(ABAP Cloud)
- 管理 PFCG 角色(本地部署)
- 定义自定义授权对象
- 了解限制类型
-
识别平台和 Clean Core 级别:
- ABAP Cloud(SAP Cloud ERP 或 SAP BTP ABAP Environment)→ IAM 应用 + 业务目录 +
CL_ABAP_AUTHORIZATION(级别 A) - 经典 ABAP / SAP Cloud ERP Private → PFCG 角色 +
AUTHORITY-CHECK(级别 B) - 包装器场景 → 为非已发布授权对象提供
SU22数据和变体
- ABAP Cloud(SAP Cloud ERP 或 SAP BTP ABAP Environment)→ IAM 应用 + 业务目录 +
-
使用相应的授权模型指导实现
授权模型
ABAP Cloud — 级别 A
IAM App → Business Catalog → Business Role → Business User
↑
Restriction Type (field-level restrictions)
使用 CL_ABAP_AUTHORIZATION(已发布的 API)。适用于 SAP Cloud ERP 和 SAP BTP ABAP Environment。
经典 ABAP — 级别 B
Authorization Object → PFCG Role → User Assignment
↑
Authorization Fields + Permitted Values
使用 AUTHORITY-CHECK。SAP Cloud ERP Private 必须使用此方式,因为其中没有 IAM/COM Fiori 应用,必须改用经典事务(PFCG、SM59、SOAMANAGER、SU21、SU22)。
SAP Cloud ERP Private 说明:与 SAP Cloud ERP(公有云)不同,SAP 与客户之间在用户、角色和通信方面没有严格的内容隔离。
包装器的授权
当包装器向 ABAP Cloud 代码公开经典 API 时,被包装的 API 通常会检查非已发布的授权对象,这些对象无法直接用于 ABAP Cloud。处理方式:
- PFCG 角色可以混合使用已发布和非已发布的授权对象
- 在包装器发布供云开发使用时,为其提供
SU22数据,以便清楚了解所需的非已发布授权对象 - 为包装器的每种指定用法创建
SU22变体,以供角色维护使用
有关包装器模式及其级别分类的完整信息,请参阅 abap-cloud 技能。
代码中的授权检查
ABAP Cloud — CL_ABAP_AUTHORIZATION
"Check authorization using released API
DATA(lo_auth) = cl_abap_authorization=>check_authorization(
EXPORTING
authorization_object = 'Z_MY_AUTH'
authorizations = VALUE #(
( field = 'ACTVT' value = '03' ) "Display
( field = 'ZCARR' value = lv_carrier )
) ).
IF lo_auth->is_authorized( ) = abap_false.
"User not authorized
RAISE EXCEPTION TYPE zcx_not_authorized.
ENDIF.
本地部署 — AUTHORITY-CHECK
AUTHORITY-CHECK OBJECT 'Z_MY_AUTH'
ID 'ACTVT' FIELD '03'
ID 'ZCARR' FIELD lv_carrier.
IF sy-subrc <> 0.
MESSAGE e001(z_msg) WITH lv_carrier.
RETURN.
ENDIF.
活动值(ACTVT)
| 值 | 活动 |
|---|---|
01 | 创建 |
02 | 更改 |
03 | 显示 |
06 | 删除 |
16 | 执行 |
授权对象
创建自定义授权对象
在 ADT 或 SU21 中:
Authorization Object: Z_MY_AUTH
Fields:
ACTVT — Activity (standard field, linked to domain ACTIV_AUTH)
ZCARR — Carrier (custom field, type S_CARR_ID)
ZREGN — Region (custom field, type CHAR4)
结构
- 授权类别:对相关对象进行分组(例如
Z_TRAVEL) - 授权对象:包含 1–10 个授权字段
- 授权字段:关联到数据元素;定义检查维度
CDS 访问控制(DCL)
CDS 访问控制为 CDS 视图实体定义行级授权。
基本 DCL
@EndUserText.label: 'Access Control for Travel'
@MappingRole: true
define role ZI_Travel {
grant select on ZI_Travel
where ( carrier_id ) =
aspect pfcg_auth ( Z_MY_AUTH, ZCARR, ACTVT = '03' );
}
多个条件
define role ZI_Travel {
grant select on ZI_Travel
where ( carrier_id ) =
aspect pfcg_auth ( Z_MY_AUTH, ZCARR, ACTVT = '03' )
and ( agency_id ) =
aspect pfcg_auth ( Z_AGENCY_AUTH, ZAGENCY, ACTVT = '03' );
}
不受限制的访问
define role ZI_Travel_Admin {
grant select on ZI_Travel
where _unrestrictedAccess;
}
继承的访问控制
"Child entity inherits access control from parent
define role ZI_Booking {
grant select on ZI_Booking
where ( carrier_id ) =
aspect pfcg_auth ( Z_MY_AUTH, ZCARR, ACTVT = '03' );
}
DCL 与 PRIVILEGED ACCESS
"Bypass DCL access control when needed (e.g., in background jobs)
SELECT FROM zi_travel
FIELDS travel_id, description
INTO TABLE @DATA(lt_all)
PRIVILEGED ACCESS.
ABAP Cloud 中的 IAM
IAM 应用
在 ADT 中创建,将服务绑定关联到授权模型:
ADT: New → Other → IAM App
Name: Z_TRAVEL_IAM
Type: EXT - External App (for OData services)
Service Binding: ZUI_TRAVEL_O4
将授权对象分配给 IAM 应用,以定义适用的检查。
业务目录
将 IAM 应用归入逻辑集合:
ADT: New → Other → Business Catalog
Name: Z_BC_TRAVEL_MGMT
Description: Travel Management
IAM Apps: Z_TRAVEL_IAM, Z_BOOKING_IAM
业务角色
在 Fiori 应用“维护业务角色”中创建:
- 创建新的业务角色(例如
Z_BR_TRAVEL_MANAGER) - 添加业务目录
- 配置限制类型(字段级访问)
- 分配业务用户
限制类型
在业务角色中定义字段级限制:
| 限制类型 | 描述 |
|---|---|
| 不受限制 | 可完全访问所有值 |
| 受限制 | 只能访问指定值 |
| 无访问权限 | 无法访问关联功能 |
示例:旅行经理角色可以将 ZCARR 限制为仅允许 LH 和 AA。
本地部署:PFCG 角色
创建 PFCG 角色
- 打开
PFCG事务 - 输入角色名称(例如,
Z_TRAVEL_DISPLAY) - 菜单选项卡:添加事务代码、Fiori 磁贴或应用
- 授权选项卡:维护授权值
- 设置授权对象和字段值
- 生成授权配置文件
- 用户选项卡:将用户分配给角色
复合角色
将多个单一角色组合在一起:
Z_TRAVEL_COMPOSITE (Composite Role)
├── Z_TRAVEL_DISPLAY (Single Role — display only)
├── Z_TRAVEL_EDIT (Single Role — create/change)
└── Z_TRAVEL_ADMIN (Single Role — full access)
RAP 授权
RAP 中的实例授权
"In behavior definition:
define behavior for ZR_Travel alias Travel
authorization master ( instance )
{
...
}
"In behavior implementation:
METHOD get_instance_authorizations.
READ ENTITIES OF zr_travel IN LOCAL MODE
ENTITY Travel
FIELDS ( carrier_id )
WITH CORRESPONDING #( keys )
RESULT DATA(lt_travels).
LOOP AT lt_travels INTO DATA(ls_travel).
DATA(lo_auth) = cl_abap_authorization=>check_authorization(
authorization_object = 'Z_MY_AUTH'
authorizations = VALUE #(
( field = 'ZCARR' value = ls_travel-carrier_id )
( field = 'ACTVT' value = COND #(
WHEN requested_authorizations-%update = if_abap_behv=>mk-on
THEN '02'
WHEN requested_authorizations-%delete = if_abap_behv=>mk-on
THEN '06'
ELSE '03' ) )
) ).
APPEND VALUE #(
%tky = ls_travel-%tky
%update = COND #( WHEN lo_auth->is_authorized( ) THEN if_abap_behv=>auth-allowed
ELSE if_abap_behv=>auth-unauthorized )
%delete = COND #( WHEN lo_auth->is_authorized( ) THEN if_abap_behv=>auth-allowed
ELSE if_abap_behv=>auth-unauthorized )
) TO result.
ENDLOOP.
ENDMETHOD.
RAP 中的全局授权
"In behavior definition:
define behavior for ZR_Travel alias Travel
authorization master ( global )
{
...
}
METHOD get_global_authorizations.
DATA(lo_auth) = cl_abap_authorization=>check_authorization(
authorization_object = 'Z_MY_AUTH'
authorizations = VALUE #(
( field = 'ACTVT' value = '01' ) ) ). "Create
IF lo_auth->is_authorized( ).
result-%create = if_abap_behv=>auth-allowed.
ELSE.
result-%create = if_abap_behv=>auth-unauthorized.
ENDIF.
ENDMETHOD.
输出格式
在解答授权/IAM 相关主题时,请按以下结构组织回复:
## Authorization Guidance
### Platform
- [ABAP Cloud / On-Premise]
- Approach: [CDS DCL / AUTHORITY-CHECK / CL_ABAP_AUTHORIZATION / IAM]
### Implementation
[Step-by-step with code examples]
### Role Configuration
[How to set up roles and assign access]
参考资料
- ABAP 授权速查表:https://github.com/SAP-samples/abap-cheat-sheets
- CDS 访问控制:https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/access-controls
- IAM 指南:https://help.sap.com/docs/btp/sap-business-technology-platform/identity-and-access-management-iam
相关技能
- abap-cloud:用于清洁核心级别、包装器模式以及
S_ABPLNGVS开发者治理 - cds-view-entities:用于实现 CDS 访问控制(DCL)
- rap:用于实现 RAP 实例授权和全局授权
- btp-abap-environment:用于设置 IAM 应用和业务角色
- abap-cloud-migration:用于将
AUTHORITY-CHECK迁移到CL_ABAP_AUTHORIZATION