intra-martとSSO
intra-martのSSO実装自体はリクエスト内容を精査してユーザーIDを渡すと ID/PW認証が無くログインできる実装が例として紹介されている。
下記を公式ページから引用する
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;
}
}
SSOユーザコードプロバイダの実装において、ユーザコードの取得方法が容易に推測可能であるような方式は、セキュリティ上好ましくありません。 ユーザコードの暗号化またはデータの改ざん防止等を考慮した実装を行うことをお奨めします。 【引用元】(SSO実装サンプル)
Class HttpServletRequestから取り出すので、幅広いリクエストの内容でも取り出せる。(Cookie オブジェクト、リクエストURI、リクエストヘッダ、etc...)
下記の実装サンプルはリクエストから取っている。(もちろん相応のセキュリティを設定する必要がある)
リバースプロキシでログインする場合、Web ServerのBase URLが一致する設定を行う必要がある。
他のリンクを押下するとドメインが異なった別ページに遷移され認証された後のCookieが保持されないので Base Url設定からリバースプロキシと同一ドメインに設定する。
この設定でログイン後、他のページのリンクを押下しても同一ドメインとしてリンクが張られているので 認証後のCookieが保持される。
※intra-martはSAML認証もOAuth認証にも対応している。
複数Base URLを設定する
通常ログインとクライアントサイドタイプ、リバースプロキシタイプを共存する場合、クロスドメイン対応になるので通常は対応できない。(SMAL認証はクロスドメインに対応している)
iAPへアクセスするURLが複数ある場合のBaseURLの設定方法にある通りBase URLを動的に設定する方法があるので通常ログイン時のリクエスト内容と、クライアントサイドタイプ・リバースプロキシタイプでリクエストで差をつけた場合、
リクエストの内容からSSOと同一ドメインで表示するかどうか判定できるようにするとSSOを使用した後のCookieも保持される。
実装例ではCookieのパラメータを読み取って判定しているがBaseURLを設定する仕込んでいるが設定する際のメソッドgetBaseUrlの引数がHttpServletRequestなのでCookie以外も取れるが…(ログイン中はBaseURLを変えずにいたいのでCookieで)
※BaseURLが2つあるとリバースプロキシで使用した認証を突破しなくても、 通常ログインのホーム画面宛にリクエストを投げること SampleSSOUserProvider.javaの判定を受けることが可能になるので、実装は本当に厳しくした方がいい。
まとめ
- intra-martで対応できるSSO形式はクライアントサイドタイプ・リバースプロキシタイプ・SAML認証タイプとある。
- SSOの実装について実際はHttpServletRequestで取得できる要素であればID/PWの認証をスキップすることができる実装も可能なので、柔軟に対応できる。
- SSOで通常ログインとを両立させる時、何らかの制約でSAML認証を使用できない場合、クライアントサイドタイプ、リバースプロキシタイプと同一ドメインのBaseURLを動的に設定できるようにしてマルチドメインにしておくと対応できる。