渡邊です。こんにちは。
EAP6の研究をしています。
備忘録を兼ねて、シングルサインオン(以下、SSO)についてハマったことを記します。
本記事で扱うのは、同一サーバインスタンス内で実行するWebアプリケーションのSSOです。
こちらの開発者ガイドを参考にしました。
web.xml を編集する
EAP6の仕組みを利用したSSOには、<コンテナ管理による認証のみ>という制限があります。
SSOに参加する全てのWebアプリケーションについて、web.xmlを次のように編集します。
<?xml version="1.0"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <security-constraint> <display-name>Security Constraint on Conversation</display-name> <web-resource-collection> <web-resource-name>examplesWebApp</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>guest</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>FORM</auth-method> <realm-name>ApplicationRealm</realm-name> <form-login-config> <form-login-page>/login.html</form-login-page> <form-error-page>/error.html</form-error-page> </form-login-config> </login-config> <security-role> <role-name>guest</role-name> </security-role> </web-app>
jboss-web.xml を編集する
SSOバルブの設定を記します。開発者ガイドには、クラスタ化されたSSOが例として示されています。
ClusteredSingleSignOnの代わりにSingleSignOnを設定します。
security-domainは、適宜変更してください。SSOに参加する全てのWebアプリケーションについて、同一のセキュリティドメインを設定する必要があります。
<?xml version="1.0" encoding="UTF-8"?> <jboss-web> <security-domain>other</security-domain> <valve> <class-name>org.apache.catalina.authenticator.SingleSignOn</class-name> </valve> </jboss-web>
org.apache.catalina.authenticator.SingleSignOnにビルドパスが通っていない場合は、pom.xmlに次の依存関係を追加します。
<dependency> <groupId>org.jboss.web</groupId> <artifactId>jbossweb</artifactId> <version>7.0.17.Final-redhat-1</version> <scope>provided</scope> </dependency>
standalone.xml または domain.xm を編集するl
virtual-server タグの中に <sso domain=”{YOUR DOMAIN}” reauthenticate=”false”/> を追加します。
reauthenticate のディフォルト値は、trueです。すると、ユーザが(SSOに参加している)新たなアプリケーションにアクセスする度に、改めて認証手続きをする必要があります(FORM認証であれば、認証FORM画面に遷移します)。つまり、見かけ上SSOが機能していないようにみえます。この設定が開発者ドキュメントに載っておらず、ハマりました。
詳細はこちら。
<subsystem xmlns="urn:jboss:domain:web:1.2" default-virtual-server="default-host" native="false"> <connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http"/> <virtual-server name="default-host" enable-welcome-root="true"> <alias name="localhost"/> <!-- <sso domain="localhost" reauthenticate="false"/> --> <sso domain="watanabe.com" reauthenticate="false"/> </virtual-server> </subsystem>