SAML SPをつくろう 【Java Servlet編】
schedule 2019/11/08 refresh 2024/02/01
目的
SeciossLinkで認証したユーザーでJava Servletで作ったWebアプリケーションにSSOする。
構成
SeciossLinkとSAML Service ProviderとのSAML認証は Apache httpd と mod_auth_mellon を使います。
Java ServletコンテナとしてApache Tomcatを使用し、Apache httpd と Apache Tomcat 間の連携には AJP(Apache Jserv Protocol)を使用します。

前提
SAML SPをつくろう 【mod_auth_mellon編】の構築が行われていることを本稿の前提条件とします。
構築手順
1. 環境設定
CentOSにtomcatをインストールします。
# yum install tomcat |
2. Apache Tomcatの設定
標準でAJPは有効な状態なので、一行だけ修正してTomcatでの認証を無効化します。
# vi /etc/tomcat/server.xml |
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" tomcatAuthentication="false" /></code> |
tomcat を起動します。
# systemctl start tomcat |
3. Apache httpdの設定
以前、作成した mellon.conf にAJPへのリバースプロキシー設定を追加します。
# vi /etc/httpd/conf.d/mellon.conf |
<Location />MellonEndpointPath "/mellon"MellonIdPMetadataFile /etc/httpd/metadata/SlinkMetadata.xmlMellonSPPrivateKeyFile /etc/httpd/metadata/https_centos_.int.secioss.work_samlsp.keyMellonSPCertFile /etc/httpd/metadata/https_centos_.int.secioss.work_samlsp.certMellonSPMetadataFile /etc/httpd/metadata/https_centos_.int.secioss.work_samlsp.xml</Location><Location /mellon>AuthType "Mellon"Require valid-userMellonEnable "auth"</Location>Alias /app /var/www/app<Location /app>AuthType "Mellon"Require valid-userMellonEnable "auth"</Location><Location /servlet>AuthType "Mellon"Require valid-userMellonEnable "auth"ProxyPass ajp://localhost:8009/</Location> |
※ /servlet は検証ページのパスです。
httpd を再起動します。
# systemctl restart httpd |
4. SeciossLinkの設定
以前、設定したSAML SPの設定を一部変更します。

|
項目名 |
設定値 |
| サービスID | mellon ※変更なし |
| サービス名 | mellon ※変更なし |
| エンティティID | https://centos76.int.secioss.work/samlsp ※変更なし |
| Assertion Consumer Service | https://centos76.int.secioss.work/mellon/postResponse ※変更なし |
| ログアウトURL | https://centos76.int.secioss.work/mellon/logout ※変更なし |
| アクセス先URL | https://centos76.int.secioss.work/servlet/ ※Java Servlet用の検証ページに変更します。 |
| IDの属性 | urn:oasis:names:tc:SAML:2.0:nameid-format:persistent ※変更なし |
登録したSAML SPをユーザーに割り当てます。
以前、設定済みでしたら変更する必要はありません。

5. 動作確認
テスト用ページの作成します。
ちょっと手抜きをして、JSPだけの検証ページです。
# mkdir /var/lib/tomcat/webapps/ROOT# /var/lib/tomcat/webapps/ROOT/index.jsp |
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html><html><body><h1>こんにちは <%=request.getUserPrincipal().getName()%> さん</h1></body></html> |
SAML認証したユーザIDは HttpServletRequest#getUserPrincipal() に設定されているので、それを表示しています。
ブラウザでアクセスURLにアクセスすると、SeciossLinkのログイン画面にリダイレクトされ、
ログインすると以下のような画面が表示されます。
https://centos76.int.secioss.work/servlet/
このようにAJPを使ったリクエストの送信ではREMOTE_USERなど限られた情報しか渡せませんが、少ない修正で簡単にSAML連携ができます。
それではまた。

