mcpField
A
authorization-iam

authorization-iam

github.com/likweitan安全7288 次安装2 周前更新
代码仓库

关于 authorization-iam

authorization-iam 是用于在 ABAP Cloud 和本地 ABAP 系统中实现授权检查与身份访问管理的技能。它讲解不同平台的模型,包括 IAM 应用和业务角色、PFCG、CDS 访问控制及 RAP 授权。

主要功能

  1. 01ABAP Cloud 与经典授权模型
  2. 02ABAP 代码中的授权检查
  3. 03使用 DCL 配置 CDS 访问控制
  4. 04IAM 应用、目录和业务角色
  5. 05PFCG 角色与 RAP 授权指南

适用场景

  1. 01为 ABAP 平台选择授权模型
  2. 02用 DCL 限制 CDS 视图行
  3. 03配置业务角色和字段限制
  4. 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 和本地部署系统中实现授权检查和身份与访问管理的指南。

工作流

  1. 确定用户的目标:

    • 在 ABAP 代码中实现授权检查
    • 创建 CDS 访问控制(DCL)
    • 设置 IAM 应用、业务目录和业务角色(ABAP Cloud)
    • 管理 PFCG 角色(本地部署)
    • 定义自定义授权对象
    • 了解限制类型
  2. 识别平台和 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 数据和变体
  3. 使用相应的授权模型指导实现

授权模型

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 应用“维护业务角色”中创建:

  1. 创建新的业务角色(例如 Z_BR_TRAVEL_MANAGER)
  2. 添加业务目录
  3. 配置限制类型(字段级访问)
  4. 分配业务用户
限制类型

在业务角色中定义字段级限制:

限制类型描述
不受限制可完全访问所有值
受限制只能访问指定值
无访问权限无法访问关联功能

示例:旅行经理角色可以将 ZCARR 限制为仅允许 LH 和 AA。

本地部署:PFCG 角色

创建 PFCG 角色
  1. 打开 PFCG 事务
  2. 输入角色名称(例如,Z_TRAVEL_DISPLAY)
  3. 菜单选项卡:添加事务代码、Fiori 磁贴或应用
  4. 授权选项卡:维护授权值
    • 设置授权对象和字段值
    • 生成授权配置文件
  5. 用户选项卡:将用户分配给角色
复合角色

将多个单一角色组合在一起:

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-cloud:用于清洁核心级别、包装器模式以及 S_ABPLNGVS 开发者治理
  • cds-view-entities:用于实现 CDS 访问控制(DCL)
  • rap:用于实现 RAP 实例授权和全局授权
  • btp-abap-environment:用于设置 IAM 应用和业务角色
  • abap-cloud-migration:用于将 AUTHORITY-CHECK 迁移到 CL_ABAP_AUTHORIZATION

评论

支持 Markdown