2020.06.16

ログインフローとプラットフォームキャッシュを使用したログイン情報管理

こんにちは、武部です。

今回は、直近の設計で検討したSalesforceのログインフローとプラットフォームキャッシュを使用したログイン情報管理について書いてみます。

検討に至った経緯

全社で在宅勤務を開始することに伴い、社内の環境以外から利用した場合に何らかの制限を付けたいとの要望があり、社内か社外かの判断のためにログイン情報管理を行う方法を検討しました。
その際にログインフローとプラットフォームキャッシュを利用した制御が、1つの案として挙がりました。

作成した内容

プラットフォームキャッシュの設定

最初にプラットフォームキャッシュの設定を行います。
設定のクイック検索で「プラットフォームキャッシュ」と検索し、プラットフォームキャッシュ区分の画面を表示します。
画面から「新規プラットフォームキャッシュ区分」をクリックし登録を行います。
Developer 組織の場合は先に「トライアル容量の要求」を行う必要があります。

プラットフォームキャッシュ区分画面

プラットフォームキャッシュ区分画面でキャッシュ区分を作成した後の画面です。

プラットフォームキャッシュ区分の編集画面

今回の組織はDeveloper 組織なのでセッションキャッシュ割り当てではトライアルに割り当てています。

プラットフォームキャッシュ登録用Apexクラス

次にプラットフォームキャッシュに登録を行うApexクラスを作成しますが、これはログインフローから呼び出しますので、Process.Plugin インターフェースを使用して作成します。
/*
* ログインフローからセッションへ情報を書き込む機能検証用のコード
*/

global class Blog_LoginSessionCache implements Process.Plugin {
    
    /*
    * ログインフローからセッションへ情報を書き込む機能
    */
    global Process.PluginResult invoke( Process.PluginRequest request) {
    
        String loginFlowApplication = (String) request.inputParameters.get('LoginFlow_Application');
        String loginFlowUserAgent = (String) request.inputParameters.get('LoginFlow_UserAgent');
        String loginFlowLoginType = (String) request.inputParameters.get('LoginFlow_LoginType');
        String loginFlowIpAddress = (String) request.inputParameters.get('LoginFlow_IpAddress');
        String loginFlowPlatform = (String) request.inputParameters.get('LoginFlow_Platform');
        String loginFlowCommunity = (String) request.inputParameters.get('LoginFlow_Community');
        String loginFlowSessionLevel = (String) request.inputParameters.get('LoginFlow_SessionLevel');

        Map<String,String> result = new Map<String,String>();
        try{
            // プラットフォームキャッシュ区分で設定したNameでパーテーションを取得する。
            Cache.SessionPartition sessionPart = Cache.Session.getPartition('local.LoginSession');
            // フローからの値をプラットフォームキャッシュに登録する。
            DateTime dt = DateTime.now();
            sessionPart.put('LoginTime', dt.format());
            sessionPart.put('Level', loginFlowSessionLevel);
            if (loginFlowCommunity == NULL)
                loginFlowCommunity = '';
            sessionPart.put('Application', loginFlowApplication );
            sessionPart.put('Agent', loginFlowUserAgent );
            sessionPart.put('Type', loginFlowLoginType);
            sessionPart.put('Ip', loginFlowIpAddress);
            sessionPart.put('Platform', loginFlowPlatform);
            sessionPart.put('Community', loginFlowCommunity);
            result.put('Result','Success');
        }catch(Exception e){
            result.put('Result','Fail');
        }
        
        return new Process.PluginResult(result);
    
    }
    
    /*
    * ログインフローからセッションへ情報を書き込む機能の定義情報
    */
    global Process.PluginDescribeResult describe() {
        Process.PluginDescribeResult result = new Process.PluginDescribeResult();
        //説明定義
        result.description = 'Blog_sessionCacheRight';
        //タグ定義
        result.tag = 'Blog_sessionCacheRight';
        //入力パラメータ定義
        result.inputParameters  = new List<Process.PluginDescribeResult.InputParameter>{
            new Process.PluginDescribeResult.InputParameter(
                'LoginFlow_Application', 
                Process.PluginDescribeResult.ParameterType.STRING, 
                true
            ),            
            new Process.PluginDescribeResult.InputParameter(
                'LoginFlow_UserAgent', 
                Process.PluginDescribeResult.ParameterType.STRING, 
                true
            ),
            new Process.PluginDescribeResult.InputParameter(
                'LoginFlow_LoginType', 
                Process.PluginDescribeResult.ParameterType.STRING, 
                true
            ),
            new Process.PluginDescribeResult.InputParameter(
                'LoginFlow_IpAddress', 
                Process.PluginDescribeResult.ParameterType.STRING, 
                true
            ),
            new Process.PluginDescribeResult.InputParameter(
                'LoginFlow_Platform', 
                Process.PluginDescribeResult.ParameterType.STRING, 
                true
            ),
            new Process.PluginDescribeResult.InputParameter(
                'LoginFlow_Community', 
                Process.PluginDescribeResult.ParameterType.STRING, 
                true
            ),
            new Process.PluginDescribeResult.InputParameter(
                'LoginFlow_SessionLevel', 
                Process.PluginDescribeResult.ParameterType.STRING, 
                true
            ),
            new Process.PluginDescribeResult.InputParameter(
                'LoginFlow_UserId', 
                Process.PluginDescribeResult.ParameterType.STRING, 
                true
            )
        };
        //出力パラメータ定義
        result.outputParameters = new List<Process.PluginDescribeResult.OutputParameter>{        
            new Process.PluginDescribeResult.OutputParameter(
                'Result',
                Process.PluginDescribeResult.ParameterType.STRING
            )
        };
        return result;
    }
}
Blog_LoginSessionCache.cls

フロー

ログインフローで指定するフローを作成します。

フローの変数と要素

フローからApexクラスに引き渡す変数を定義し、Apexアクション(従来)を追加します。

Apexアクション(従来)の設定

フローからApexクラスへ引き渡す値を割り当てます。

ログインフロー

最後にログインフローを定義します。

ログインフロー設定画面

作成したフローとユーザーライセンス、プロファイルを設定します。

動作確認

設定した内容でプラットフォームキャッシュに出力されているかVisualforce ページを使用し確認します。
以下は確認に使用したVisualforceページです。
<apex:page >
  <h1>キャッシュ情報確認</h1>
  <br/>LoginTime:<apex:outputText value="{!$Cache.Session.local.LoginSession.LoginTime}"/>
  <br/>LoginFlowApplication:<apex:outputText value="{!$Cache.Session.local.LoginSession.Application}"/>
  <br/>LoginFlowUserAgent:<apex:outputText value="{!$Cache.Session.local.LoginSession.Agent}"/>
  <br/>LoginFlowLoginType:<apex:outputText value="{!$Cache.Session.local.LoginSession.Type}"/>
  <br/>LoginFlowIpAddress:<apex:outputText value="{!$Cache.Session.local.LoginSession.Ip}"/>
  <br/>LoginFlowPlatform:<apex:outputText value="{!$Cache.Session.local.LoginSession.Platform}"/>
  <br/>LoginFlowSessionLevel:<apex:outputText value="{!$Cache.Session.local.LoginSession.Level}"/>
</apex:page>
LoginDemo
一度プラットフォームキャッシュに登録することで、Visualforceページから値を取得することが出来ます。
これにより複数のVisualforceページを利用している場合でも、Apexクラスで都度IPアドレスを取得する必要がなくなり、既存のVisualforceページとApexクラスがある場合でも追加改修の範囲を少なくすることが可能です。

プラットフォームキャッシュ確認

ログインフローの対象ユーザでログインし、対象のVisualforceページを開くとログインフローから渡されプラットフォームキャッシュに設定された値が表示されます。

取得したログイン情報の使用例

プラットフォームキャッシュに登録したログイン情報を利用し、Visualforceページで作成された画面のボタンを表示制御します。
今回のサンプルで設定した内容は下記の通りで、outputPanel のrendered属性に表示条件を設定しています。
表示制御したいボタンはoutputPanelの内側に配置することで、社内の場合に編集、削除可能とし社外ではボタンを表示しません。
<apex:outputPanel rendered="{!IF(LEN($Cache.Session.local.LoginSession.Ip) > 0 && CONTAINS($Label.TrustedIP ,$Cache.Session.local.LoginSession.Ip),true,false)}">
記述例

取引先画面を社内IPアドレスから見た場合

条件に一致する場合、画面のようにボタンが表示されます。

取引先画面を社外IPアドレスから見た場合

条件に合わない場合、ボタンは表示されません。

最後に

今回はログインフローとプラットフォームキャッシュを使用したログイン情報管理をご紹介させて頂きました。

ログインフローとプラットフォームキャッシュは組み合わせなくてもいろいろな用途があり、それによりApexクラス等の実装部分を少なくすることが可能ですのでシステム設計の際にはご検討ください。

最後までお読みいただき、ありがとうございました。
30 件
     
  • banner
  • banner

関連する記事