intra-mart Accel Platform 認証プログラミングガイド 第7版 2018-04-01

6.2. 二重ログイン防止機能

6.2.1. 二重ログイン防止機能 動作仕様

二重ログイン防止機能とは、既にログインしているユーザと同じユーザコードを利用した別の環境(ブラウザ)からのログインを防止する機能です。(二重ログイン防止機能)
また、システム管理者およびテナント管理者がユーザのログイン状況を参照・無効化する機能を提供します。(ログインセッション管理機能)

二重ログイン防止機能を利用した際の認証処理は以下の動作を行います。
  1. 有効な認証かどうか判定を行う。
    • ここでWebサービスや外部ソフトウェア接続モジュールなどの外部連携APIを利用した認証処理等は二重ログイン防止機能の対象外です。
    • 二重ログイン防止機能が無効な場合は通常のログイン処理が行われます。
  2. ログイン情報とアカウント情報のユーザコード、パスワードの比較を行う。
    • ログイン情報とアカウント情報が異なる場合は、この時点で認証NGです。
  3. データベースにログインセッション情報が登録されているかチェックを行う。
    • ログインセッション情報が存在する場合は、二重ログインとして認証NGです。
  4. ログイン処理を行う。
  5. ログインしたユーザのログインセッション情報をデータベースに登録する。

コラム

ログインセッション管理機能の画面操作に関しては「テナント管理者操作ガイド」 - 「ログインセッションを無効化する」を参照してください。

6.2.1.1. 二重ログイン防止機能 標準認証プロバイダ・プラグイン

二重ログイン防止機能は以下の認証プロバイダ・プラグインで構成されています。
  • 認証プロバイダ

    実装クラス

    jp.co.intra_mart.foundation.security.login_session.certification.LoginSessionUserCertification

    処理概要
    ログイン情報とアカウント情報のユーザコード、パスワードを比較します。
    ユーザコード、パスワードに間違いがなければ、ログインセッション情報を参照して、二重ログインチェックを行います。
  • 認証リスナ

    実装クラス

    jp.co.intra_mart.foundation.security.login_session.listener.LoginSessionUserCertificationListener

    処理概要
    この認証リスナではログインセッション情報をデータベースへ登録します。
    登録されたログインセッション情報はユーザがログアウトした場合やセッションの有効期限が切れた場合等、セッションが無効になった時点で削除されます。

6.2.1.2. 二重ログイン防止機能を無効化する方法

二重ログイン防止機能を無効化したい場合は、以下の plugin.xml の enable 属性に false を設定し、 intra-mart Accel Platform を再起動してください。
または、IM-Juggling のプロジェクトに以下のように設定した <plugin.xml> ファイルを含む plugin フォルダをプロジェクト直下にコピーして、WARファイルを作成し再デプロイしてください。
設定内容

ログイン用認証リスナ設定

%CONTEXT_PATH%/WEB-INF/plugin/jp.co.intra_mart.security.user.certification.login_session/plugin.xml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<plugin>
  <extension point="jp.co.intra_mart.security.user.certification">
    <certification
        name="standard"
        id="jp.co.intra_mart.security.user.certification.login_session"
        version="8.0"
        rank="90"
        enable="false">
      <certification-class>jp.co.intra_mart.foundation.security.login_session.certification.LoginSessionUserCertification</certification-class>
      <certification-listener>
        <listener-class>jp.co.intra_mart.foundation.security.login_session.listener.LoginSessionUserCertificationListener</listener-class>
      </certification-listener>
    </certification>
  </extension>
</plugin>

強制ログイン用認証リスナ設定

%CONTEXT_PATH%/WEB-INF/plugin/jp.co.intra_mart.security.user.certification.login_session_8.0.4/plugin.xml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<plugin>
  <extension point="jp.co.intra_mart.security.user.force_login">
    <certification
        name="standard"
        id="jp.co.intra_mart.security.user.certification.login_session"
        version="8.0.4"
        rank="90"
        enable="false">
      <certification-listener>
        <listener-class>jp.co.intra_mart.foundation.security.login_session.listener.LoginSessionUserCertificationListener</listener-class>
      </certification-listener>
    </certification>
  </extension>
</plugin>
また、二重ログイン防止機能を無効化してログインセッション管理機能のみ利用する場合は、ログイン用認証リスナ設定の <certification-class> をコメントアウトし認証リスナのみ有効にします。
設定内容
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<plugin>
  <extension point="jp.co.intra_mart.security.user.certification">
    <certification
        name="standard"
        id="jp.co.intra_mart.security.user.certification.login_session"
        version="8.0"
        rank="90">
      <!-- certification-class をコメントアウトすると二重ログインチェックは行われません。
      <certification-class>jp.co.intra_mart.foundation.security.login_session.certification.LoginSessionUserCertification</certification-class>
       -->
      <certification-listener>
        <listener-class>jp.co.intra_mart.foundation.security.login_session.listener.LoginSessionUserCertificationListener</listener-class>
      </certification-listener>
    </certification>
  </extension>
</plugin>

6.2.2. 二重ログインチェックを行わずにログイン処理を行う方法

UserCertificationManager を使用してログイン処理を実行する場合に、 forceLogin メソッドを使用して強制ログインを行うか、以下の拡張属性をログイン情報に設定することで、二重ログインチェックを行わずにログイン処理を実行する事ができます。

  • 拡張属性名

    im_login_session.certification.validation

  • 拡張属性値

    false

実装例は以下です。
1
2
loginRequestInfo.setAttribute("im_login_session.certification.validation", "false");
UserCertificationManager.getInstance().login(loginRequestInfo);

6.2.3. 個別に作成した認証プロバイダで二重ログイン防止機能を実現する方法

新しい認証方式に対応するために開発した認証プロバイダ・プラグインで二重ログイン防止機能を実現するには以下の作業が必要です。
ここでは、 サンプル の「LDAP 認証」を利用した認証方式のプロバイダに二重ログインチェックを追加する例を利用しながら説明します。

6.2.3.1. ステップ1:作成した認証プロバイダを拡張した二重ログインチェックを行う認証プロバイダを作成する

新しい認証方式に対応する認証プロバイダを継承して、二重ログインチェックを行う認証プロバイダを作成します。
継承元の認証処理が成功した場合、二重ログインチェックを行うように実装します。
二重ログインチェックを行うには、以下のAPIを使用します。
APIクラス名
jp.co.intra_mart.foundation.security.login_session.certification.DuplicationLoginChecker
実装例
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
public class LoginSessionLDAPUserCertification extends LDAPUserCertification {
    @Override
    public CertificationStatus certification(final LoginInfo loginInfo, final AccountInfo user, final HttpServletRequest request, final HttpServletResponse response) {
        // 継承元の認証処理を実行します。
        final CertificationStatus status = super.certification(loginInfo, user, request, response);
        if (status != CertificationStatus.CR_OK) {
            // 認証失敗の場合は、そのまま認証ステータスを返却します。
            return status;
        }
        // 二重ログインチェックを行います。
        return DuplicationLoginChecker.certification(loginInfo, user, request, response);
    }
}

6.2.3.2. ステップ2:plugin.xml の設定を追加する

plugin.xml に作成した二重ログインチェックを行う認証プロバイダの設定を変更します。
新しい認証方式に対応する認証プロバイダの設定を記述した plugin.xml の以下の内容を変更します。
<certification> の rank 属性
標準の二重ログイン防止認証プロバイダよりも小さい値(90未満)を指定します。
<certification>/<certification-class>
設定内容
jp.co.intra_mart.system.security.certification.provider.ldap.LoginSessionLDAPUserCertification
ステップ1で作成した認証プロバイダクラスを設定します。
<certification>/<certification-listener>/<listener-class>
設定内容
jp.co.intra_mart.foundation.security.login_session.listener.LoginSessionUserCertificationListener
ログインセッションを登録する認証リスナクラスを設定します。
設定例
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8"?>
<plugin>
  <extension point="jp.co.intra_mart.security.user.certification">
    <certification
      name="standard"
      id="jp.co.intra_mart.security.user.certification.ldap"
      rank="80">
      <certification-class>jp.co.intra_mart.system.security.certification.provider.ldap.LoginSessionLDAPUserCertification</certification-class>
      <!-- 変更前の認証プロバイダクラス
      <certification-class>jp.co.intra_mart.system.security.certification.provider.ldap.LDAPUserCertification</certification-class>
       -->
      <!-- ログインセッション情報を登録するための認証リスナクラス -->
      <certification-listener>
        <listener-class>jp.co.intra_mart.foundation.security.login_session.listener.LoginSessionUserCertificationListener</listener-class>
      </certification-listener>
      <certification-validation>
        <validation-class>jp.co.intra_mart.system.security.certification.provider.ldap.LDAPUserCertificationValidation</validation-class>
      </certification-validation>
    </certification>
  </extension>
</plugin>
作成したクラスと plugin.xml を含めたWARファイルを作成し再デプロイを行うと、二重ログイン防止機能が動作します。