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

6.1. SSO(シングルサインオン)対応

SSOユーザコードプロバイダを実装することで、intra-mart Accel Platform アクセス時にリクエスト情報(リクエストヘッダー、クッキー、リクエストパラメータなど)からユーザ情報を取得して自動ログインを行うことができます。
これにより、シングルサインオン(以下、SSO と記述します)を実現することができます。

intra-mart Accel Platform における SSO の仕様については、「認証仕様書」 - 「SSO(シングルサインオン)」を参照してください。

6.1.1. SSOユーザコードプロバイダ・プラグイン

一般ユーザのSSOを実現するには、次のプロバイダを実装します。

プラグイン一覧
プロバイダ名 概要 拡張ポイント
SSOユーザコードプロバイダ リクエスト情報を元に、SSOさせたいユーザコードを返却します。 jp.co.intra_mart.foundation.security.certification.sso.user.providers

6.1.2. SSOユーザコードプロバイダ・プラグイン詳細

6.1.2.1. インタフェース定義

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
package jp.co.intra_mart.foundation.security.certification.sso;

import javax.servlet.http.HttpServletRequest;

/**
 * シングルサインオンの自動ログイン用ユーザ情報の取得を行うインタフェースです。
 */
public interface SSOUserProvider {

    /**
     * 自動ログインを行うユーザコードを返却します。<br>
     * ユーザコードを取得できなかった場合はnullを返却します。
     * @param request サーブレットリクエスト
     * @return ユーザコード
     */
    String getUserCd(final HttpServletRequest request);

}

6.1.2.2. 標準実装

初期状態で提供されるプロバイダはありません。

6.1.2.3. 実装サンプル

リクエストパラメータ「sample_user_code」からユーザコードを取得し、SSOするサンプルです。
ユーザをリクエストパラメータ「sample_user_code」として送信することにより、自動ログインを実現します。
なお、本コードはサンプルであるため、セキュリティを考慮していません。
  • サンプル Java コード

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package sample;
    
    import javax.servlet.http.HttpServletRequest;
    
    import jp.co.intra_mart.foundation.security.certification.sso.SSOUserProvider;
    
    public class SampleSSOUserProvider implements SSOUserProvider {
        @Override
        public String getUserCd(final HttpServletRequest request) {
            // リクエストパラメータからSSOユーザコードを取得します
            final String userCd = request.getParameter("sample_user_code");
    
            if (userCd != null) {
                return userCd;
            }
    
            // nullを返却することで別のプロバイダに処理を委譲できます
            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.foundation.security.certification.sso.user.providers">
        <sso-user-providers
          id="sample.programming_guide.sso_user_provider"
          name="Sample SSO User Provider"
          version="1.0"
          rank="50">
          <sso-user-provider class="sample.SampleSSOUserProvider"/>
        </sso-user-providers>
      </extension>
    </plugin>
    
引数のリクエスト情報から、ユーザコードを返却するようにします。null を返却することで、別のプラグインに処理を委譲することができます。
全てのSSOユーザコードプロバイダプラグインが null を返却した場合、未認証としてアクセスされます。
SSOユーザコードプロバイダプラグインが 存在しないユーザコードを返却した場合、 intra-mart Accel Platform 2013 Winter(Felicia) までは未認証としてアクセスされ、intra-mart Accel Platform 2014 Spring(Granada) 以降のバージョンでは HTTP500 エラーが出力されます。
プラグインとして設定された順番にプロバイダが実行されます。
順番を考慮した実装および設定を行ってください。
動作確認を行うために以下のURLにアクセスしてください。ユーザ「aoyagi」でログインしていればサンプルは正しく動作しています。
  • http://<HOST>:<PORT>/<CONTEXT_PATH>/home?sample_user_code=aoyagi

注意

SSOユーザコードプロバイダの実装において、ユーザコードの取得方法が容易に推測可能であるような方式は、セキュリティ上好ましくありません。 ユーザコードの暗号化またはデータの改ざん防止等を考慮した実装を行うことをお奨めします。