前置き
SNC Nameを使用したSSOを実装したときに、ユーザに一括設定する機能がTr-Cd:SNC1に存在します。
しかしこの機能はユーザIDかエイリアスを使用したSNC名しか設定できず、それ以外の属性でSSOマッピングするときにはBAdI実装を選択する必要があります。
今回はSSOマッピングによく使われる属性E-Mailを使用するBAdIを実装してみました。
前提
今回はS/4HANA2023に対して実装します。
SAP_BASIS 500以前のバージョンは以下のノートの適用を確認します。
https://me.sap.com/notes/1839538
メールアドレスをマッピング属性値としたSSO設定を実装済です。
筆者はBASISエンジニアですが、今回はアプリ系の実装が多いため説明間違いなどがある可能性があります。
その場合はコメントで指摘いただけばと思います。
ABAPクラスの作成
-
Tr-Cd:SE24を実行して標準オブジェクト CL_USRACL_BADI をコピーします。
-
今回は ZCL_USRACL_BADI として作成します。
-
パッケージを登録します。今回はローカルオブジェクトで登録します。
-
Mwthodsタブに表示されている IF_BADI_CREATE_PNAME~CREATE_PNAME をダブルクリックします。
-
この画面のコードを書き換えます。
この部分を変更します。標準だとlr_mapping->bnameでユーザIDを指定しています。
CONCATENATE iv_prefix lr_mapping->bname iv_postfix INTO lr_mapping->pname. -
以下のように書き換えました。
先ほどのコードを以下に更新します。
処理の説明についてはコメントをつけているので、省略します。
メールアドレスは複数設定できるのでFLGDEFAULTフラグが設定されているメールアドレスを条件にしています。CLEAR lv_email. " SU01 の E-Mail Address 欄のメールアドレスを取得 " USR21: ユーザID → アドレス番号の紐付け " ADR6 : アドレス番号 → メールアドレスの紐付け " FLGDEFAULT = 'X' : SU01メイン欄(標準アドレス)のみ対象 SELECT SINGLE adr6~smtp_addr FROM usr21 INNER JOIN adr6 ON adr6~addrnumber = usr21~addrnumber AND adr6~persnumber = usr21~persnumber WHERE usr21~bname = @lr_mapping->bname AND adr6~flgdefault = 'X' INTO @lv_email. IF lv_email IS NOT INITIAL. " Prefix + メールアドレス + Suffix でSNC名を組み立て CONCATENATE iv_prefix lv_email iv_postfix INTO lr_mapping->pname. ELSE. " メール未設定ユーザはSNC名を設定しない CLEAR lr_mapping->pname. ENDIF. -
保存して有効化します。
画面下にObject(s) activatedが表示されたら次に進みます。
Enhancement Implementationの作成
- Tr-Cd:SE24を実行します。
- BAdI Nameを選択して USRACL_BADI_CREATE_PNAME を入力、Displayをクリックします。
Enhancement Spot:JSREXTIDMAPPINGの画面でBAdI定義を確認しておきます。
- Tr-Cd:SE19を実行します。
- Create Implementationで New BAdI を選択して USREXTIDMAPPING を入力、Create ボタンをクリックします。
- 拡張実装名と説明を入力します。今回は ZENH_SNC_EMAIL で作成します。
- パッケージを登録します。今回はローカルオブジェクトで登録します。
- BAdI実装名を決定して入力します。今回は ZIMP_SNC_EMAIL として作成します。
クラスには先ほど作った ZCL_USRACL_BADI を指定します。
BADI定義には手順に2で確認した USRACL_BADI_CREATE_PNAME を指定します。
- Filter Valueを設定します。Combination ボタンをクリックします。
- Value1には先ほど設定したBAdI実装名を入力して実行します。
- 保存して有効化します。
画面下にActive object generatedが表示されたら次に進みます。
BAdI動作確認
実装は完了したのでSNC nameの一括変更をテストしていきます。
-
まずユーザの設定状態について確認していきます。
ユーザにはメールアドレスを設定しています。 -
このあとSNC1で複数ユーザへのSNC一括設定をテストするため、同様に複数テストユーザを作成してテストメールアドレスを設定しました。
ユーザID メールアドレス SNC設定 パスワード認証フラグ SSOTESTUSER sso.test@gmail.com なし オン SSOTESTUSER2 sso.test2@gmail.com なし オン SSOTESTUSER3 sso.test3@gmail.com なし オン ※パスワード認証フラグ:Allow password logon for SAP GUI (user-specific)のチェックボックス
-
Tr-Cd:SNC1を実行して動作確認していきます。変更したいユーザを複数選択するため、右側のボタンをクリックします。

今回は3ユーザなので手で入力しましたが、数百以上のユーザを更新する場合は別途SU10などでユーザ一覧を用意してインポートします。

-
以下は今回SSO設定しているSNC nameのサンプルです。
p:CN=<メールアドレス>, L=XXX, OU=XXX, OU=XXX, O=SAP SE, C=DE
これを以下のように設定していきます。
Prefix of SNC Name:p:CN=
Suffix of SNC Name:, L=XXX, OU=XXX, OU=XXX, O=SAP SE, C=DE
BAdI Implementationに作成したBAdI実装 ZIMP_SNC_EMAIL を設定します。

今回SNC nameが設定されていないユーザにのみ設定するので、Users without SNC names only:にチェックを入れておきます。 -
SNC nameにメールアドレスが問題なく引けていること、SNC nameとして機能する形になっていることを確認します。
パスワード認証フラグをオフにしたいので、Password Logonのチェックボックスのチェックを外して保存します。

ユーザSNC設定確認
- SU01でSNC設定したユーザを確認します。
SNC nameが適切に設定されていて、パスワード認証フラグもオフになっています。
- 残りの2ユーザについても同様にSNC設定されたことを確認します。
- SSOが問題なく機能することを確認します。
- ここまで確認したら基本的な動作確認は完了です。
最後に
今回の設定はSSOの初期設定段階でユーザ一括設定するシナリオで記載しましたが、SSOを無効化する際にSNC1からパスワード認証フラグを一括有効化する場合にも使えます。
パスワード認証フラグを一括変更すると、SNC nameも同時に初期提案値で保存されてしまい、SSOできなくなります。
この設定をいれておくことで、SSO障害発生時のパスワードログオン有効化も一括設定可能です。
今回作成したABAPクラスのコードについてはAIと相談して作成しています。
実際の現場では長年使用しているADR6テーブルのレコード状況によっては、取得メールアドレスの不具合が起こる可能性もあるため、ご参考程度にしていただければ幸いです。




