【Apex】別のユーザーでログインしたことを検知したい

# はじめに
この記事では、別のユーザーでログインしていることをApexで検知する方法に関して記載します。
以前の記事で、Experience Cloudにログインしているユーザーが``ユーザーとしてエクスペリエンスにログイン``でログインしているユーザーかどうかを見分ける方法を解説しましたが、ついでに書こうと思ったものになります。

https://qiita.com/y_yano/items/2174fc80200646d6130e

# 前提の話
別ユーザでログインできる権限がある方に関しては、別ユーザーでログインしている場合、ページの上部に下記画像のようなものが表示されると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667494/8fc7e4b8-2945-2131-b19e-1be0aecb2104.png)

その場合画面上はわかるけど内部的に判断して、処理を分けたりすることができるのかなーと思ったので記事としてまとめてみました。

# 本題
見分け方に関しては**SessionManagement クラス**の**getCurrentSession メソッド**取得される下記1つを注意してみてみれば判別できます。
``SessionType == 'SubstituteUser'``

Apexで例を記載して説明します。

```apex 
Map<String,String> currentSessionMap = Auth.SessionManagement.getCurrentSession();
System.debug('currentSessionMap : '+currentSessionMap);
Boolean isSubstituteUser = currentSessionMap.get('SessionType') == 'SubstituteUser' ? true : false;
System.debug('実際のユーザーは"別ユーザーとしてログイン"を使用してログインしています : ' + isSubstituteUser);
```
``別のユーザーでログイン``を使用してログインした場合のデバッグは下記のようになります。
※一部内容を非表示にしています[^1]
[^1]: IPアドレス
```
//別のユーザーでログインを使用してログインした場合のデバッグ内容
currentSessionMap : {
    UsersId = 0055i00000AuHI7AAN,
    Username = test@testsales.com,
    SessionType = SubstituteUser,
    UserType = Standard,
    LoginType = Unknown,
    SourceIp = ************,
    SessionSecurityLevel = STANDARD,
    SessionId = 0Ak5i0000GFVDOqCQP,
    ParentId = null,
    LogoutUrl = null,
    LoginDomain = null,
    LoginHistoryId = 0Ya5i00003zuPYaCAM,
    LoginGeoId = null,
    CreatedDate = Sun Nov 06 32:16:18 GMT 2023,
    LastModifiedDate = Sun Nov 06 32:16:18 GMT 2023,
    NumSecondsValid = 7200
}
実際のユーザーは"別ユーザーとしてログイン"を使用してログインしています : true
```
通常通りユーザ名、パスワードでログインした場合のデバッグは下記のようになります。
※一部内容を非表示にしています[^2]
[^2]: IPアドレス
```
//通常通りユーザ名、パスワードでログインした場合のデバッグ内容
currentSessionMap : {
    UsersId = 0055i000008Ks77AAC,
    Username = yano@ikktest.com,
    SessionType = Aura,
    UserType = Standard,
    LoginType = Remote Access 2.0,
    SourceIp = ************,
    SessionSecurityLevel = STANDARD,
    SessionId = 0Ak5i0000GECDGeCQP,
    ParentId = 0Ak5i0000GECDFbCQP,
    LogoutUrl = null,
    LoginDomain = test.lightning.force.com,
    LoginHistoryId = 0Ya5i00003zuPYaCAM,
    LoginGeoId = 04F5i00003szWRTEA2,
    CreatedDate = Sun Nov 06 42:16:18 GMT 2023,
    LastModifiedDate = Sun Nov 06 42:16:18 GMT 2023,
    NumSecondsValid = 7200
}
実際のユーザーは"別ユーザーとしてログイン"を使用してログインしています : false
```

## 結論
**SessionManagement クラス**の**getCurrentSession メソッド**取得される下記1つを注意してみてみれば判別できます。
``SessionType == 'SubstituteUser'``

何かしら別のユーザーでログインしたことを検知して処理を分けたい場合、下記のコードを参考に実装できるかと思います。
よかったら参考にしてみてください！
```apex
Map<String,String> currentSessionMap = Auth.SessionManagement.getCurrentSession();
Boolean isSubstituteUser = currentSessionMap.get('SessionType') == 'SubstituteUser' ? true : false;
if(isSubstituteUser){
    //別のユーザーでログインしている場合の処理
}else{
    //通常通りユーザー名、パスワードでログインしている場合の処理
}
```

下記にSessionManagement クラスのApex 開発者ガイドとユーザーセッション種別を張っておきます。
気になる方は確認してみてください！

SessionManagement クラス

https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_class_Auth_SessionManagement.htm

ユーザーセッション種別

https://help.salesforce.com/s/articleView?id=sf.security_session_types.htm&type=5


本記事は以上となります。
ご覧いただきありがとうございました！