intra-mart Accel Platform 認証仕様書 第7版 2023-04-01

4.2.2. 一般ユーザの認証プロバイダ・プラグイン

一般ユーザのログイン処理フロー 」で説明した、一般ユーザのログイン処理で利用する認証プロバイダ・プラグインと、 intra-mart Accel Platform の標準で提供されるプロバイダ(以下、標準プロバイダ)の動作について説明します。

4.2.2.1. 一般ユーザの認証プロバイダ・プラグインの概要

認証機能の主な処理を行う個別の拡張可能なプログラムを、「認証プロバイダ・プラグイン」と呼びます。
認証プロバイダ・プラグインはプラグイン化されており、新しいプラグインを追加することで、認証機能の動作を変更できます。
これにより、要件に合わせて認証方式を変更することが可能です。
認証プロバイダ・プラグインは一般ユーザ用とシステム管理者用が用意されており、別々の認証方式を利用できます。

注意

認証プロバイダ・プラグインは、システムで共通で利用されます。
そのため、バーチャルテナントによる複数テナントを利用する場合、全てのテナントで同じプロバイダが利用されます。
もし、テナントごとに異なる認証方式を利用したい場合、プロバイダ内でテナントの判定を行って処理を行うプロバイダを作成する必要があります。
以下に、一般ユーザ用の認証プロバイダ・プラグインの詳細について説明します。

4.2.2.2. 認証プロバイダ・プラグイン一覧

認証機能で提供される一般ユーザ用の認証プロバイダ・プラグインは、以下の通りです。
「対象のテナント」は、リクエスト情報を利用したテナント自動解決機能を利用しない場合の処理対象です。
リクエスト情報を利用したテナント自動解決機能の詳細は「intra-mart Accel Platform セットアップガイド」 - 「テナント解決機能」 - 「リクエスト情報を利用したテナント自動解決機能について」 を参照してください。
表 一般ユーザ用認証プロバイダ・プラグイン一覧
プロバイダ名 概要 拡張ポイント 対象のテナント
初期リクエスト解析プロバイダ ログイン画面表示時に送信されたリクエスト情報を解析して、ログイン情報を設定します。 jp.co.intra_mart.security.user.initial_request_analyzer デフォルトテナント
ログインページプロバイダ ログイン画面用のページパス情報を取得します。 jp.co.intra_mart.security.user.login_page デフォルトテナント
リクエスト解析プロバイダ ログイン実行時に送信されたリクエスト情報を解析して、ログイン情報を設定します。 jp.co.intra_mart.security.user.login_request_analyzer ログイン時に指定されたテナント
認証条件判定プロバイダ 認証プロバイダを利用するための条件判定を行います。 (認証プロバイダの追加情報として定義) ログイン時に指定されたテナント
認証プロバイダ ログイン情報などを利用して、実際の認証処理を実行します。 jp.co.intra_mart.security.user.certification ログイン時に指定されたテナント
認証リスナ 認証処理の後処理を実行します。 (認証プロバイダの追加情報として定義) ログイン時に指定されたテナント
遷移先ページプロバイダ ログイン成功時に遷移する画面のページパス情報を取得します。 jp.co.intra_mart.security.user.target_page ログイン時に指定されたテナント
認証プロバイダ・プラグインは、intra-mart Accel Platform のプラグイン機構として設定され、PluginManager により読み込まれます。
各プラグインには設定情報のキーとして、「拡張ポイント」が定義されています。
また、同じ拡張ポイントに複数のプラグインを設定でき、rank 属性を設定することにより、 プラグインの読み込み順序を制御することが可能です。
プラグインの仕様については、 「 PluginManagerのAPIドキュメント 」 を参照してください。
認証プロバイダ・プラグインは、それぞれ複数設定することが可能です。
複数設定されている場合の動作については、各認証プロバイダ・プラグインの項目を参照してください。
新しい認証プロバイダ・プラグインを作成して場合は、適切な順序で実行されるように設定を行ってください。

4.2.2.3. 認証プロバイダ・プラグインの詳細

各プロバイダの詳細と実装方法について以下の順に説明します。
  1. インタフェース定義

    プロバイダのインタフェース

  2. 標準プロバイダ

    intra-mart Accel Platform が提供する標準プロバイダ

  3. 実装サンプル

    プロバイダの実装サンプル

4.2.2.3.1. 初期リクエスト解析プロバイダ

ログイン画面表示時に送信されたリクエスト情報を解析して、ログイン情報を設定します。
ログイン情報を変更することで、ログイン後のロケールやタイムゾーンを設定することが可能です。
ログイン情報の詳細については、 「 LoginRequestInfo クラスの APIドキュメント 」 を参照してください。
ここで設定されたログイン情報は、リクエストパラメータ 「im_login_info」 を利用してログイン処理に引き継がれます。
複数の初期リクエスト解析プロバイダが設定されている場合、プラグインとして設定された順番にプロバイダが実行されます。
順番を考慮した実装および設定を行ってください。

4.2.2.3.1.1. インタフェース定義

1
2
3
4
5
6
package jp.co.intra_mart.foundation.security.certification.provider;

public interface RequestAnalyzer {

    LoginInfo parseRequest(LoginRequestInfo loginInfo, HttpServletRequest request);
}
第1引数の loginInfo の必要なプロパティを変更して、そのまま返却することを想定しています。
複数の初期リクエスト解析プロバイダが設定されている場合、返却した loginInfo は、次に実行されるプロバイダの第1引数として利用されます。

4.2.2.3.1.2. 標準プロバイダ

標準プロバイダはありません。

4.2.2.3.1.3. 実装サンプル

リクエストパラメータ「sample_home_url」からログイン情報にホームURLを設定するサンプルです。
  • サンプル Java コード

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package sample;
    
    public class SampleHomeUrlRequestAnalyzer implements RequestAnalyzer {
    
        @Override
        public LoginInfo parseRequest(LoginRequestInfo loginInfo, HttpServletRequest request) {
    
            // ログイン画面表示時にリクエストパラメータからホームURL情報を設定します。
            String homeUrl = request.getParameter("sample_home_url");
    
            if (homeUrl != null && !homeUrl.isEmpty()) {
    
                // ログイン情報に設定します。
                loginInfo.setHomeUrl(homeUrl);
            }
    
            return loginInfo;
        }
    
    }
    
  • サンプルプラグイン設定ファイル

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    <?xml version="1.0" encoding="UTF-8"?>
    <plugin>
      <extension point="jp.co.intra_mart.security.user.initial_request_analyzer">
        <initial_request
          name="Sample Initial RequestAnalyzer"
          id="sample.programming_guide.initial_request_analyzer"
          version="1.0"
          rank="200">
    
          <request-analyzer-class>sample.SampleHomeUrlRequestAnalyzer</request-analyzer-class>
    
        </initial_request>
      </extension>
    </plugin>
    
引数のログイン情報を要件に合わせて更新し、更新したログイン情報を返却するようにします。
ここで設定した情報は、ログイン画面で保持されてログイン処理に引き継がれます。

4.2.2.3.2. リクエスト解析プロバイダ

ログイン実行時に送信されたリクエスト情報を解析して、ログイン情報を設定します。
ログイン情報を変更することで、ログイン後のロケールやタイムゾーンを設定することが可能です。
ログイン情報の詳細については、 「 LoginRequestInfo クラスの APIドキュメント 」 を参照してください。
プラグインとして設定された順番にプロバイダが実行されます。
順番を考慮した実装および設定を行ってください。

4.2.2.3.2.1. インタフェース定義

初期リクエスト解析プロバイダ 」 と同じインタフェースを利用します。

4.2.2.3.2.2. 標準プロバイダ

実装クラス名(一般ユーザ用)
  • jp.co.intra_mart.system.security.certification.provider.impl.StandardLoginRequestAnalyzer
処理概要
以下の情報をリクエストパラメータから取得してログイン情報に設定します。
取得情報 リクエストパラメータ名
ユーザコード im_user
パスワード im_password
遷移先ページパス im_url
遷移先ページパスには、ログイン後に遷移するページのURLが指定できます、 外部サイトのURLの場合、許可されたサイトのみ遷移可能です。
許可されていないサイトの場合は、遷移先ページパスは設定されません。
外部サイトの許可設定については、「設定ファイルリファレンス」 - 「認証外部ページURL許可リスト設定」を参照してください。
遷移先ページパスによる遷移を無効にする場合は、「設定ファイルリファレンス」 - 「リクエストパラメータによる画面遷移サポートの有無(ログイン時)」を参照してください。

4.2.2.3.2.3. 実装サンプル

特定のIPアドレスからアクセスされた場合、パスワードを要求せずに認証済みに設定するサンプルです。
  • サンプル Java コード

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    package sample;
    
    public class SampleCheckIPAddressRequestAnalyzer implements RequestAnalyzer {
    
        private static final String TRUSTED_ADDRESS = "192.168.1.2";
    
        @Override
        public LoginInfo parseRequest(LoginRequestInfo loginInfo, HttpServletRequest request) {
    
            // アクセスしたクライアントのIPアドレスを取得します。
            String address = request.getRemoteAddr();
    
            if (TRUSTED_ADDRESS.equals(address)) {
    
                // 特定のIPアドレスからアクセスされた場合、認証済みに設定します。
                // パスワード確認処理は行いません。
                // ただし、ユーザコードがない場合、アカウント情報が取得できないためエラーになります。
                loginInfo.setDoneCertification(true);
            }
    
            return loginInfo;
        }
    
    }
    
  • サンプルプラグイン設定ファイル

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8"?>
    <plugin>
      <extension point="jp.co.intra_mart.security.user.login_request_analyzer">
        <login_request
          name="Sample RequestAnalyzer"
          id="sample.programming_guide.request_analyzer" version="1.0" rank="50">
    
          <request-analyzer-class>sample.SampleCheckIPAddressRequestAnalyzer</request-analyzer-class>
    
        </login_request>
      </extension>
    </plugin>
    
引数のログイン情報を要件に合わせて更新し、更新したログイン情報を返却するようにします。
認証プロバイダや認証リスナで利用する情報は、このプロバイダでログイン情報に設定してください。
標準プロバイダでは、ログイン情報にユーザコード、パスワード、遷移先ページパスを設定しています。
また、サンプルのように認証済み設定(loginInfo.setDoneCertification(true))を行うことで、認証処理をスキップすることが可能です。
その場合でも認証リスナは実行されます。

4.2.2.3.3. 認証プロバイダ

ログイン情報などを利用して、実際の認証処理を実行します。
認証結果により、以下のコードを返却してください。
表 認証プロバイダの返却コード
返却コード 条件
CertificationStatus.CR_OK 認証に成功した場合
CertificationStatus.CR_NG 入力した情報が間違っているなどで、認証に失敗した場合
CertificationStatus.CR_ERROR 環境などの要因で、認証が実行できない場合

注意

ログイン不可と判定された場合、認証プロバイダは実行されません。詳しくは、「 一般ユーザのログイン処理フロー 」の「 認証API 」-「 ログイン 」を参照してください。

4.2.2.3.3.1. インタフェース定義

1
2
3
4
5
6
package jp.co.intra_mart.foundation.security.certification.provider;

public interface UserCertification {

    CertificationStatus certification(LoginInfo loginInfo, AccountInfo user, HttpServletRequest request, HttpServletResponse response);
}

注意

パスワード保存方式に「ハッシュ化」を利用している場合、引数のAccountInfoからパスワード値を取得できません。
常に null が返ります。
LoginInfo に指定されているパスワードに対して照合を行いたい場合は、「 AccountPasswordAdapter クラスの APIドキュメント 」を利用してください。

4.2.2.3.3.2. 標準プロバイダ

実装クラス名(一般ユーザ用)
  • jp.co.intra_mart.system.security.certification.provider.impl.StandardUserCertification
処理概要
ログイン情報とアカウント情報のユーザコード、パスワードを比較します。
ユーザコード、パスワードが未設定(null)の場合はエラーです。

4.2.2.3.3.3. 実装サンプル

ユーザが入力したパスワードとアカウントのパスワードを比較するサンプルです。
  • サンプル Java コード

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    package sample;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import jp.co.intra_mart.foundation.admin.account.model.AccountInfo;
    import jp.co.intra_mart.foundation.admin.account.password.AccountPasswordAdapter;
    import jp.co.intra_mart.foundation.admin.exception.PasswordException;
    import jp.co.intra_mart.foundation.security.certification.CertificationStatus;
    import jp.co.intra_mart.foundation.security.certification.model.LoginInfo;
    import jp.co.intra_mart.foundation.security.certification.provider.UserCertification;
    
    public class SampleAccountPasswordUserCertification implements UserCertification {
    
        @Override
        public CertificationStatus certification(final LoginInfo loginInfo, final AccountInfo user, final HttpServletRequest request, final HttpServletResponse response) {
            final String userCd = loginInfo.getUserCd();
            final String password = loginInfo.getPassword();
    
            final AccountPasswordAdapter adapter = new AccountPasswordAdapter();
            try {
                // アカウントのパスワード値の照合を行います。
                if (!adapter.collate(userCd, password)) {
                    // パスワードが一致しないためNGを返却します。
                    return CertificationStatus.CR_NG;
                }
            } catch (final PasswordException e) {
                e.printStackTrace();
                // 何らかの理由でパスワードの照合に失敗したためエラーを返却します。
                return CertificationStatus.CR_ERROR;
            }
    
            // パスワードの照合に成功したためOKを返却します。
            return CertificationStatus.CR_OK;
        }
    
    }
    
  • サンプルプラグイン設定ファイル

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <?xml version="1.0" encoding="UTF-8"?>
    <plugin>
      <extension point="jp.co.intra_mart.security.user.certification">
        <certification
          name="Sample UserCertification / UserCertificationValidation / UserCertificationListener"
          id="sample.programming_guide.user_certification" version="1.0" rank="50">
    
          <!-- UserCertification -->
          <certification-class>sample.SampleAccountPasswordUserCertification</certification-class>
    
          <!-- UserCertificationValidation -->
          <certification-validation>
            <validation-class>sample.SampleAccountPasswordUserCertificationValidation</validation-class>
          </certification-validation>
    
          <!-- UserCertificationListener -->
          <certification-listener>
            <listener-class>sample.SampleMailAlertUserCertificationListener</listener-class>
          </certification-listener>
    
        </certification>
      </extension>
    </plugin>
    

4.2.2.3.4. 認証条件判定プロバイダ

認証プロバイダ 」 を利用するための条件判定を行います。
intra-mart Accel Platform では、プラグインを複数登録することで、複数の認証プロバイダを登録できます。
複数の認証プロバイダが登録されている場合に、認証の要求に対してどの認証プロバイダを利用するかを、この認証条件判定プロバイダを利用して判定します。
このプロバイダが設定されていない認証プロバイダは常に利用対象です。
認証条件判定プロバイダは、認証プロバイダと同じプラグイン設定に設定し、その認証プロバイダを条件判定の対象とします。
同じ認証プロバイダに対して、複数設定することが可能です。
複数設定されている場合は、設定された全ての認証条件判定プロバイダの処理結果が true である場合に、条件判定の対象となる認証プロバイダが利用されます。

注意

ログイン不可と判定された場合、認証条件判定プロバイダは実行されません。詳しくは、「 一般ユーザのログイン処理フロー 」の「 認証API 」-「 ログイン 」を参照してください。

4.2.2.3.4.1. インタフェース定義

1
2
3
4
5
6
package jp.co.intra_mart.foundation.security.certification.provider;

public interface UserCertificationValidation {

    boolean validate(LoginInfo loginInfo, AccountInfo user, HttpServletRequest request, HttpServletResponse response);
}

注意

パスワード保存方式に「ハッシュ化」を利用している場合、引数のAccountInfoからパスワード値を取得できません。
常に null が返ります。

4.2.2.3.4.2. 標準プロバイダ

標準プロバイダはありません。

4.2.2.3.4.3. 実装サンプル

システムプロパティにて、サンプルの認証プロバイダを利用する設定が行われているかを確認するサンプルです。
  • サンプル Java コード

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    package sample;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import jp.co.intra_mart.foundation.admin.account.model.AccountInfo;
    import jp.co.intra_mart.foundation.security.certification.model.LoginInfo;
    import jp.co.intra_mart.foundation.security.certification.provider.UserCertificationValidation;
    
    public class SampleAccountPasswordUserCertificationValidation implements UserCertificationValidation {
    
        @Override
        public boolean validate(final LoginInfo loginInfo, final AccountInfo user, final HttpServletRequest request, final HttpServletResponse response) {
    
            // システムプロパティからサンプルのアカウントパスワードによる照合を行う認証プロバイダをサポートするかを判定します。
            final boolean result = Boolean.getBoolean("sample.account.password.support");
    
            return result;
        }
    
    }
    
  • サンプルプラグイン設定ファイル

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <?xml version="1.0" encoding="UTF-8"?>
    <plugin>
      <extension point="jp.co.intra_mart.security.user.certification">
        <certification
          name="Sample UserCertification / UserCertificationValidation / UserCertificationListener"
          id="sample.programming_guide.user_certification" version="1.0" rank="50">
    
          <!-- UserCertification -->
          <certification-class>sample.SampleAccountPasswordUserCertification</certification-class>
    
          <!-- UserCertificationValidation -->
          <certification-validation>
            <validation-class>sample.SampleAccountPasswordUserCertificationValidation</validation-class>
          </certification-validation>
    
          <!-- UserCertificationListener -->
          <certification-listener>
            <listener-class>sample.SampleMailAlertUserCertificationListener</listener-class>
          </certification-listener>
    
        </certification>
      </extension>
    </plugin>
    
認証プロバイダを利用するための条件を指定します。
認証プロバイダの対応する認証方式がサポートされているかなどを確認します。
設定された認証条件判定プロバイダの処理結果が true である場合に、条件判定の対象となる認証プロバイダ(サンプルプラグイン設定ファイルの場合は、sample.SampleAccountPasswordUserCertification )が利用されます。

4.2.2.3.5. 認証リスナ

認証処理の後処理を実行します。
認証結果を基に、ログの出力や通知処理などを実行するために利用します。
このプロバイダは、認証が成功した場合も認証が失敗した場合も呼び出されます。
引数の認証結果を確認して必要な処理を行ってください。

注意

認証が成功した場合、このプロバイダの実行時には、ログインが完了して認証済みのアクセスコンテキストが生成されています。
また認証が失敗した場合は、アクセスコンテキストはログインしていない状態に切り替わります。
アクセスコンテキストの情報を参照する場合は注意してください。

注意

認証APIは、1つのトランザクションで処理されます。
そのため、認証リスナでデータベースなどのトランザクション管理されている情報を更新しても、その後の処理によっては、ロールバックされる可能性があります。
別トランザクションとする場合は、独自にトランザクションを開始するようにしてください。

注意

ログイン不可と判定された場合、認証リスナは実行されません。詳しくは、「 一般ユーザのログイン処理フロー 」の「 認証API 」-「 ログイン 」を参照してください。
認証リスナは、複数の認証プロバイダが設定されている場合に、特定の認証プロバイダが実行されたときのみ実行されるように設定することが可能です。
  • 特定の認証プロバイダのみ実行する場合

    プラグイン設定ファイルに、認証プロバイダ(<certification-class>)とセットで設定します。
    【設定例】
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    <?xml version="1.0" encoding="UTF-8"?>
    <plugin>
      <extension point="jp.co.intra_mart.security.user.certification">
        <certification
          name="Sample"
          id="sample.certification"
          version="8.0"
          rank="100">
          <certification-class>sample.certification.SampleUserCertification</certification-class>
          <certification-listener>
            <listener-class>sample.certification.SampleCertificationListener</listener-class>
          </certification-listener>
        </certification>
      </extension>
    </plugin>
    
  • 全ての認証プロバイダで実行する場合

    プラグイン設定ファイルに、認証プロバイダ(<certification-class>)を記述せずに設定します。
    【設定例】
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    <?xml version="1.0" encoding="UTF-8"?>
    <plugin>
      <extension point="jp.co.intra_mart.security.user.certification">
        <certification
          name="Sample"
          id="sample.certification"
          version="8.0"
          rank="100">
          <certification-listener>
            <listener-class>sample.certification.SampleCertificationListener</listener-class>
          </certification-listener>
        </certification>
      </extension>
    </plugin>
    

コラム

アカウントコンテキストについては、「 アクセスコンテキスト仕様書 」-「 アカウントコンテキスト 」を参照してください。

コラム

一般ユーザの認証時の認証リスナを提供する場合は、一般ユーザの強制ログイン時の認証リスナの提供を行うことも検討してください。
詳細は、「 強制ログイン用認証リスナ 」 を参照してください。

4.2.2.3.5.1. インタフェース定義

1
2
3
4
5
6
package jp.co.intra_mart.foundation.security.certification.provider;

public interface UserCertificationListener {

    void doCertification(CertificationStatus status, LoginInfo loginInfo, AccountInfo user, HttpServletRequest request, HttpServletResponse response);
}

注意

パスワード保存方式に「ハッシュ化」を利用している場合、引数のAccountInfoからパスワード値を取得できません。
常に null が返ります。

4.2.2.3.5.2. 標準プロバイダ

標準プロバイダはありません。

4.2.2.3.5.3. 実装サンプル

ログイン処理の失敗をメール通知するサンプルです。
  • サンプル Java コード

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    package sample;
    
    public class SampleMailAlertUserCertificationListener implements UserCertificationListener {
    
        @Override
        public void doCertification(CertificationStatus status, LoginInfo loginInfo, AccountInfo user, HttpServletRequest request, HttpServletResponse response) {
    
            if (status != CertificationStatus.CR_OK) {
    
                // 通知メールを作成します。
                StandardMail mail = new StandardMail();
                mail.setFrom("iap@example.com");
                mail.addTo("admin@example.com");
                mail.setSubject("ログイン通知");
                mail.setText("ユーザ:" + loginInfo.getUserCd() + " のログインに失敗しました。");
    
                // 通知メールを送信します。
                MailSender sender = new JavaMailSender(mail);
                try {
                    sender.send();
                } catch (MailSenderException e) {
                    e.printStackTrace();
                }
            }
        }
    
    }
    
  • サンプルプラグイン設定ファイル

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <?xml version="1.0" encoding="UTF-8"?>
    <plugin>
      <extension point="jp.co.intra_mart.security.user.certification">
        <certification
          name="Sample UserCertification / UserCertificationValidation / UserCertificationListener"
          id="sample.programming_guide.user_certification" version="1.0" rank="50">
    
          <!-- UserCertification -->
          <certification-class>sample.SampleAccountPasswordUserCertification</certification-class>
    
          <!-- UserCertificationValidation -->
          <certification-validation>
            <validation-class>sample.SampleAccountPasswordUserCertificationValidation</validation-class>
          </certification-validation>
    
          <!-- UserCertificationListener -->
          <certification-listener>
            <listener-class>sample.SampleMailAlertUserCertificationListener</listener-class>
          </certification-listener>
    
        </certification>
      </extension>
    </plugin>
    
認証の後処理として実行したい、任意の処理を行います。

4.2.2.3.6. ログインページプロバイダ

ログイン画面用のページパス情報を取得します。
ここで取得されるパスは、 PageManager API の forward() メソッドで利用されるパス情報であり、URLではないので注意してください。
条件に従ってログインページ情報を、PageUrl オブジェクトに設定します。
設定されたページにはフォワードにより遷移されますが、PageUrl オブジェクトにリクエストパラメータを追加設定することが可能です。
条件に一致しない場合は、null を返却するようにします。
その場合、プラグインとして設定された次のプロバイダに処理が引き継がれます。

4.2.2.3.6.1. インタフェース定義

1
2
3
4
5
6
package jp.co.intra_mart.foundation.security.certification.provider;

public interface LoginPageProvider {

    PageUrl getLoginPage(LoginInfo loginInfo, HttpServletRequest request, HttpServletResponse response);
}

4.2.2.3.6.2. 標準プロバイダ

実装クラス名(一般ユーザ用)
  • jp.co.intra_mart.system.security.certification.provider.impl.StandardUserLoginPageProvider
処理概要
PageManager.getPageUrl() API を利用して、ログインページのパスを取得します。
実際のページパスは、以下に設定されています。
  • クライアントタイプ = PC の場合: <plugin/jp.co.intra_mart.certification.page.standard/plugin.xml>
  • クライアントタイプ = SP の場合: <plugin/jp.co.intra_mart.security.user.login_page.sp/plugin.xml>
API の引数に指定するページコードは、jp.co.intra_mart.foundation.security.certification.CertificationPage.LOGIN_PAGE です。

4.2.2.3.6.3. 実装サンプル

特定のリクエストパラメータ(custom)が設定されている場合に、プラグイン設定ファイルから、ログインページのページパスとリクエストパラメータを取得するサンプルです。
  • サンプル Java コード

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    package sample;
    
    public class SampleLoginPageProvider implements LoginPageProvider, XmlInitParamable {
    
        private String page;
    
        private Map<String, String> params;
    
        @Override
        public PageUrl getLoginPage(LoginInfo loginInfo, HttpServletRequest request, HttpServletResponse response) {
    
            // ログイン画面表示時にリクエストパラメータからカスタムログインページ情報フラグを取得します。
            String custom = request.getParameter("custom");
    
            if (custom != null) {
    
                if (page != null && !page.isEmpty()) {
                    // プラグイン設定ファイルの情報から、ログインページ情報を作成します。
                    PageUrl pageUrl = new PageUrl(page, params);
                    return pageUrl;
                }
    
            }
    
            // 対象外の場合は、その他のプロバイダに移譲します。
            return null;
        }
    
        @Override
        public void init(Node node) {
            // XmlInitParamable を実装することで、プラグイン設定ファイルからノード情報を取得できます。
    
            // プラグイン設定ファイルから、ページパスとリクエストパラメータを取得します。
            XmlNode[] nodes = new XmlNode(node).select("page");
            this.page = nodes[0].getValue();
    
            params = XmlNodeConverter.createInitParamMap(node);
        }
    }
    
  • サンプルプラグイン設定ファイル

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?xml version="1.0" encoding="UTF-8"?>
    <plugin>
      <extension point="jp.co.intra_mart.security.user.login_page">
        <page
          name="Sample LoginPageProvider" id="sample.programming_guide.login_page"
          version="1.0" rank="200">
    
          <page-provider-class>sample.SampleLoginPageProvider</page-provider-class>
    
          <page>/sample/login.jsp</page>
          <init-param>
            <param-name>foo</param-name>
            <param-value>bar</param-value>
          </init-param>
    
        </page>
      </extension>
    </plugin>
    

4.2.2.3.7. 遷移先ページプロバイダ

ログイン成功時に遷移する画面のページパス情報を取得します。
ここで取得されるパスは、 PageManager API の redirect() メソッドを利用してリダイレクトするURL情報です。
条件に従って遷移先情報を、PageUrl オブジェクトに設定します。
PageUrl オブジェクトは、リクエストパラメータを設定できます。
また、POSTによる遷移も可能です。
条件に一致しない場合は、null を返却するようにします。
その場合、プラグインとして設定された次のプロバイダに処理が引き継がれます。
全ての 「 遷移先ページプロバイダ 」 で情報が取得できなかった場合、認証APIはアカウントコンテキストのホームURLを取得します。

4.2.2.3.7.1. インタフェース定義

1
2
3
4
5
6
package jp.co.intra_mart.foundation.security.certification.provider;

public interface TargetPageProvider {

    PageUrl getTargetPage(LoginInfo loginInfo, HttpServletRequest request, HttpServletResponse response);
}

4.2.2.3.7.2. 標準プロバイダ

実装クラス名(一般ユーザ用)
  • jp.co.intra_mart.system.security.certification.provider.impl.StandardUserTargetPageProvider
処理概要
以下の順にページ情報を取得します。
  • ログイン情報に遷移先ページパスが設定されている場合、そのページパスを取得します。
  • HTTPセッションに遷移先情報が設定されている場合、そのページパスを取得します。
  • 取得できなかった場合、null を返却します。

4.2.2.3.7.3. 実装サンプル

初回ログインユーザに対してウェルカムページを表示するサンプルです。
  • サンプル Java コード

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    package sample;
    
    public class SampleWelcomeTargetPageProvider implements TargetPageProvider {
    
        private static final String WELCOME_PAGE = "/welcome";
    
        @Override
        public PageUrl getTargetPage(final LoginInfo loginInfo, final HttpServletRequest request, final HttpServletResponse response) {
    
            // 初回ログインフラグを取得します。
            // 認証リスナ「SampleFirstLoginUserCertificationListener」であらかじめ、リクエストに設定しておきます。
            final String isFirstLoginFlag = (String) request.getAttribute("first_login");
            final boolean isFirstLogin = Boolean.valueOf(isFirstLoginFlag);
    
            if (isFirstLogin) {
                return new PageUrl(WELCOME_PAGE);
            }
    
            // 対象外の場合は、その他のプロバイダに移譲します。
            return null;
        }
    
    }
    
  • サンプルプラグイン設定ファイル

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8"?>
    <plugin>
      <extension point="jp.co.intra_mart.security.user.target_page">
        <page
          name="Sample TargetPageProvider" id="sample.programming_guide.target_page"
          version="1.0" rank="200">
    
          <page-provider-class>sample.SampleWelcomeTargetPageProvider</page-provider-class>
    
        </page>
      </extension>
    </plugin>
    

4.2.2.4. 標準プロバイダの認証フロー

intra-mart Accel Platform の認証モジュールで提供されている一般ユーザ用標準プロバイダによる認証フローは以下の通りです。
../../../_images/standard-provider-flow-standard.png

図 一般ユーザの標準プロバイダを利用した場合の認証フロー

図で示した標準プロバイダの実装クラスは、以下の通りです。
表 一般ユーザ用標準プロバイダ一覧
標準プロバイダ 実装クラス rank
ログインページプロバイダ1 jp.co.intra_mart.system.security.certification.provider.impl.StandardUserLoginPageProvider 100
リクエスト解析プロバイダ1 jp.co.intra_mart.system.security.certification.provider.impl.StandardLoginRequestAnalyzer 100
認証プロバイダ1 jp.co.intra_mart.system.security.certification.provider.impl.StandardUserCertification 100
遷移先ページプロバイダ1 jp.co.intra_mart.system.security.certification.provider.impl.StandardUserTargetPageProvider 100