渡邊です。こんにちは。
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>