mcpField
A
authorization-iam

authorization-iam

github.com/likweitanセキュリティ7288 回インストール2 週間前に更新
リポジトリ

authorization-iam について

authorization-iamは、ABAP CloudとオンプレミスABAPシステムで認可チェックとID・アクセス管理を実装するためのスキルです。IAMアプリやビジネスロールからPFCG、CDSアクセス制御、RAP認可まで、環境ごとの方式を説明します。

主な機能

  1. 01ABAP Cloudとクラシック認可モデル
  2. 02ABAPコードでの認可チェック
  3. 03DCLによるCDSアクセス制御
  4. 04IAMアプリ、カタログ、ビジネスロール
  5. 05PFCGロールとRAP認可のガイド

活用シーン

  1. 01ABAP環境に適した認可モデルの選択
  2. 02DCLによるCDSビュー行の制限
  3. 03ビジネスロールとフィールド制限の設定
  4. 04RAPへのグローバル認可またはインスタンス認可の追加

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/likweitan/abap-skills --skill authorization-iam

インストール後、Claude Code で/authorization-iamを入力して読み込まれたか確認します。

同梱ファイルreferences/authorization-patterns.md

詳細

認可と IAM

ABAP Cloud およびオンプレミスシステムで認可チェックと ID/アクセス管理を実装するためのガイドです。

ワークフロー

  1. ユーザーの目標を特定する:

    • ABAP コードに認可チェックを実装する
    • CDS アクセス制御(DCL)を作成する
    • IAM アプリ、ビジネスカタログ、ビジネスロールを設定する(ABAP Cloud)
    • PFCG ロールを管理する(オンプレミス)
    • カスタム認可オブジェクトを定義する
    • 制限タイプを理解する
  2. プラットフォームとクリーンコアレベルを特定する:

    • 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)

(リリース済み API である)CL_ABAP_AUTHORIZATION を使用します。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 と顧客の間に厳密なコンテンツ分離はありません。

ラッパーの認可

ラッパーがクラシック API を ABAP Cloud コードに公開する場合、ラップされた 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 への移行に使用します

コメント