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.xml MellonSPPrivateKeyFile /etc/httpd/metadata/https_centos_.int.secioss.work_samlsp.key MellonSPCertFile /etc/httpd/metadata/https_centos_.int.secioss.work_samlsp.cert MellonSPMetadataFile /etc/httpd/metadata/https_centos_.int.secioss.work_samlsp.xml </Location> <Location /mellon> AuthType "Mellon" Require valid-user MellonEnable "auth" </Location> Alias /app /var/www/app <Location /app> AuthType "Mellon" Require valid-user MellonEnable "auth" </Location> <Location /servlet> AuthType "Mellon" Require valid-user MellonEnable "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連携ができます。
それではまた。