こんにちは、武部です。
今回は、直近の設計で検討したSalesforceのログインフローとプラットフォームキャッシュを使用したログイン情報管理について書いてみます。
今回は、直近の設計で検討したSalesforceのログインフローとプラットフォームキャッシュを使用したログイン情報管理について書いてみます。
検討に至った経緯
全社で在宅勤務を開始することに伴い、社内の環境以外から利用した場合に何らかの制限を付けたいとの要望があり、社内か社外かの判断のためにログイン情報管理を行う方法を検討しました。
その際にログインフローとプラットフォームキャッシュを利用した制御が、1つの案として挙がりました。
その際にログインフローとプラットフォームキャッシュを利用した制御が、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
フロー
ログインフローで指定するフローを作成します。
ログインフロー
最後にログインフローを定義します。
動作確認
設定した内容でプラットフォームキャッシュに出力されているかVisualforce ページを使用し確認します。
以下は確認に使用した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ページを利用している場合でも、Apexクラスで都度IPアドレスを取得する必要がなくなり、既存のVisualforceページとApexクラスがある場合でも追加改修の範囲を少なくすることが可能です。
取得したログイン情報の使用例
プラットフォームキャッシュに登録したログイン情報を利用し、Visualforceページで作成された画面のボタンを表示制御します。
今回のサンプルで設定した内容は下記の通りで、outputPanel のrendered属性に表示条件を設定しています。
表示制御したいボタンはoutputPanelの内側に配置することで、社内の場合に編集、削除可能とし社外ではボタンを表示しません。
今回のサンプルで設定した内容は下記の通りで、outputPanel のrendered属性に表示条件を設定しています。
表示制御したいボタンはoutputPanelの内側に配置することで、社内の場合に編集、削除可能とし社外ではボタンを表示しません。
<apex:outputPanel rendered="{!IF(LEN($Cache.Session.local.LoginSession.Ip) > 0 && CONTAINS($Label.TrustedIP ,$Cache.Session.local.LoginSession.Ip),true,false)}">
記述例
最後に
今回はログインフローとプラットフォームキャッシュを使用したログイン情報管理をご紹介させて頂きました。
ログインフローとプラットフォームキャッシュは組み合わせなくてもいろいろな用途があり、それによりApexクラス等の実装部分を少なくすることが可能ですのでシステム設計の際にはご検討ください。
最後までお読みいただき、ありがとうございました。
ログインフローとプラットフォームキャッシュは組み合わせなくてもいろいろな用途があり、それによりApexクラス等の実装部分を少なくすることが可能ですのでシステム設計の際にはご検討ください。
最後までお読みいただき、ありがとうございました。
30 件