ABAP

【ABAP】AUTHORITY-CHECK―権限チェック

本ページでは、SAPのアドオン開発で用いられる「AUTHORITY-CHECK」命令について解説します。

通常、SAPの標準機能であれば、権限を付与しない限りその機能を利用できないのがデフォルトです。

ほぼすべての機能で、事前に権限チェックが実装されているため、何の権限も持たないユーザはSAPのほとんどの機能を実行できません。

が、アドオンプログラムは逆です。

アドオン開発の場合は、デフォルトで権限制御が効かないため、デフォルトは「全ユーザが自由に使える状況」です。

もし、その機能をユーザ限定で開放するためには、本ページで解説するように、「AUTHORITY-CHECK」の命令を明示的に組み込む必要があります。

本ページは、権限とは何か?権限オブジェクトや、権限項目についての前提知識を必要とします。基本的な部分については、以下のページで解説をしていますので、是非ご覧ください。

早速解説を始めます。

AUTHORITY-CHECK

「AUTHORITY-CHECK」はユーザの権限をチェックする命令です。

構文:AUTHORITY-CHECK

AUTHORITY-CHECK OBJECT (権限オブジェクト)
  ID(権限項目)FIELD =(権限項目の値).

解説:AUTHORITY-CHECK

AUTHORITY-CHECKでは、現在のユーザ(その機能の実行ユーザ)に特定の権限が付与されているかどうかをチェックします。

実行ユーザに割り当てられているロールに当該の「権限オブジェクト」が設定されているか?

権限項目が設定されているか?

権限項目の値が一致するかどうか?

を1つの命令で実行します。

以下のように、複数の権限項目の指定も可能です。

AUTHORITY-CHECK OBJECT (権限オブジェクト)
ID(権限項目a)FIELD =(権限項目の値)
ID(権限項目b)FIELD =(権限項目の値).

最大10個までチェックすることが可能なのですが、10個もチェックするのは保守性の観点から避けたほうが良いでしょう。

結果:SY-SUBRC

権限チェックの結果は、システム項目「SY-SUBRC」に格納されます。

※システム項目がよく分からないかたはこちらの記事をご覧ください。

AUTHORITY-CHECKについては、SY-SUBRCにどの値が入ってくるか?を詳しく知っているとデバッグで役立ちますので、少しだけ深く説明します。

リターンコード:0

「0」は権限チェックに成功したことを示します。

すなわち、当該ユーザが権限を保持しているユーザである、という意味です。このあとに、「IF SY-SUBRC = 0」の条件で、続きの処理を書いていきます。

リターンコード:4

「4」は権限チェックの失敗です。権限を持たないユーザであるということです。

ここで言う「権限を持たないユーザ」というのは、権限項目の値が異なっている、という意味です。

FIELDに”01″(登録)を指定した場合、当該ユーザには”03″(照会)しかついていない場合がこれに該当します。権限オブジェクトと権限項目はあるが、値だけが異なっているよ!ということです。

通常は「IF = SY-SUBRC <> 0」の条件分岐に入り、処理を中断させる処理に続きます。

リターンコード:12

これもリターンコード「4」と同様、権限を持たないユーザである場合に設定されます。

が、4と異なるのは「そもそも権限項目がない場合」に12となるということです。

同じ失敗でも4と12では微妙に異なります。権限テストなどで、原因を詳細に知りたい場合にこの知識があると「できるABAPer」です。

サンプルコード

AUTHORITY-CHECK OBJECT 'F_T011'
  ID 'ACTVT' FIELD '01'
  ID 'VERSN' FIELD '1000' .

IF SY-SUBRC <> 0.
  MESSAGE '権限がありません'TYPE E.
ENDIF.

権限オブジェクト ”F_T011” は財務諸表バージョンに関わるオブジェクトです。

その下にぶら下がる権限項目 ”ACTVT” は登録・変更・参照などを制御、 “VERSN” はどの財務諸表バージョンを対象とするか?というものです。

上記サンプルコードでは、財務諸表バージョン1000に対して、登録権限を持っているかどうか?というチェックをしています。

基本はIF文とセットになる

先ほど解説した通り、「AUTHORITY-CHECK」の結果は「SY-SUBRC」にしか入りません。

すなわち、後続では「AUTHORITY-CHECK」の結果どうするか?という処理が続くため、ほぼ100%IF文が続きます。

頻繁にMESSAGE命令との組み合わせで記述されることが多いので、以下のページとセットで覚えておくと良いかもしれません。