Tomcat SingleSignOn 検証
目的
- Tomcat に付属のSingleSignOn機能を検証する
環境構築
Windows
- インストールパラメータ
項目 | 内容 |
---|---|
Javaインストール先 | C:\jdk1.5.0_12 |
tomcatインストール先 | D:\tomcat5b |
tomcat SHUTDOWNポート | 28005 |
tomcat HTTPポート | 28080 |
tomcat AJP13ポート | 28009 |
ログインユーザーID | tomcat |
ログインパスワード | tomcat |
確認用webアプリケーション1 | http://localhost:28080/servlets-examples/ |
確認用webアプリケーション2 | http://localhost:28080/servlets-examples2/ |
ログイン用フォーム | http://localhost:28080/servlets-examples/login_form.jsp |
Java 確認
- コマンドプロンプトで set コマンドを実行
- JAVA_HOME 環境変数が設定されていることを確認, 例: C:\jdk1.5.0_12
- PATH 環境変数に %JAVA_HOME%\bin が含まれることを確認, 例: C:\jdk1.5.0_12\bin
- java -version コマンド確認
D:\>java -version java version "1.5.0_12" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_12-b04) Java HotSpot(TM) Client VM (build 1.5.0_12-b04, mixed mode, sharing)
Tomcat インストール
D:\tomcat5b にインストール
D:\> dir d:\@user\soft\Java\apache-tomcat-5.5.25.zip ...(中略).. 2007/09/25 14:16 6,898,457 apache-tomcat-5.5.25.zip ...(中略).. D:\> unzip -x d:\@user\soft\Java\apache-tomcat-5.5.25.zip ...(中略).. D:\>ren apache-tomcat-5.5.25 tomcat5b
tomcat5b 設定
- bin\startup.bat, bin\shutdown.bat に CATALINA_HOME設定追加
D:\> notepad D:\tomcat5b\bin\startup.bat D:\> notepad D:\tomcat5b\bin\shutdown.bat
set CATALINA_HOME=D:\tomcat5b
- conf\server.xml 編集
D:\> cd \tomcat5b\conf D:\tomcat5b\conf> copy server.xml server.xml.orig D:\tomcat5b\conf> notepad server.xml
<?xml version="1.0" encoding="UTF-8"?> <Server port="28005" shutdown="SHUTDOWN"> <GlobalNamingResources> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> <Service name="Catalina"> <Connector port="28080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" /> <Connector port="28009" enableLookups="false" redirectPort="8443" protocol="AJP/1.3" /> <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat5b"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> </Host> </Engine> </Service> </Server>
起動
D:\tomcat5b\conf> cd \ D:\> \tomcat5b\bin\startup.bat
- 起動ログ確認
2007/09/25 15:25:44 org.apache.catalina.startup.Catalina start 情報: Server startup in 15141 ms
- 起動ポート確認
D:\>netstat -an | grep LISTENING | grep 280 TCP 0.0.0.0:28009 0.0.0.0:0 LISTENING TCP 0.0.0.0:28080 0.0.0.0:0 LISTENING TCP 127.0.0.1:28005 0.0.0.0:0 LISTENING
- アプリケーション動作確認 http://localhost:28080/servlets-examples/
停止
D:\> \tomcat5b\bin\shutdown.bat
Webアプリケーション設定
必要のないwebアプリケーションの削除
- webapps\balancer
- webapps\jsp-examples
- webapps\ROOT
- webapps\tomcat-docs
- webapps\webdav
- conf\Catalina\localhost\manager.xml
- conf\Catalina\localhost\host-manager.xml
Linux
- インストール先 CATALINA_HOME が /usr/local/tomcat5b
- 文字コード euc-jp が作業しやすいが、必須でない。UTF-8 がよい。
- その他は修正なし
検証
ログイン
conf\tomcat-users.xml 修正
- 役割(role)「tomcat」が存在すること
<role rolename="tomcat"/>
- id/pw=tomcat/tomcat でログインすると役割(role)「tomcat」を持つように。
<user username="tomcat" password="tomcat" roles="tomcat"/>
webapps\servlets-examples\login_form.jsp 作成
<%@page pageEncoding="Windows-31J" contentType="text/html; charset=Windows-31J" %> <html> <head> <title>login_form</title> </head> <body> <form method="POST" action="j_security_check"> <p>id:<input type="text" name="j_username"></p> <p>pw:<input type="password" name="j_password"></p> <p><input type="submit" value="ログイン"></p> </form> </body> </html>
webapps\servlets-examples\login_error.jsp 作成
<%@page pageEncoding="Windows-31J" contentType="text/html; charset=Windows-31J" %> <html> <head> <title>login_error</title> </head> <body> login error!! </body> </html>
webapps\servlets-examples\show_user.jsp 作成
<%@page pageEncoding="Windows-31J" contentType="text/html; charset=Windows-31J" %> <html> <head> <title>login_success!!</title> </head> <body> login success!! <p>request:<%=request%></p> <p>request.getRemoteHost(): <%=request.getRemoteHost()%></p> <p>request.getContextPath(): <%=request.getContextPath()%></p> <p>request.getRemoteUser(): <%=request.getRemoteUser()%></p> <p>session.getId(): <%=session.getId()%></p> <p><a href="logout.jsp">logout</a></p> </body> </html>
webapps\servlets-examples\logout.jsp 作成
<%@page pageEncoding="Windows-31J" contentType="text/html; charset=Windows-31J" %> <html> <head> <title>logout</title> </head> <body> <% session.invalidate(); %> logout!! <a href="show_user.jsp">ユーザー情報表示(要ログイン)</a> </body> </html>
webapps/servlets-examples/WEB-INF/web.xml 追加設定
<security-constraint> <web-resource-collection> <web-resource-name>edi</web-resource-name> <url-pattern>/*</url-pattern> <http-method>GET</http-method> <http-method>POST</http-method> </web-resource-collection> <auth-constraint> <role-name>tomcat</role-name> </auth-constraint> </security-constraint>
<login-config> <auth-method>FORM</auth-method> <form-login-config> <form-login-page>/login_form.jsp</form-login-page> <form-error-page>/login_error.jsp</form-error-page> </form-login-config> </login-config>
<security-role> <role-name>tomcat</role-name> </security-role>
ログアウト
- basic/digest ではログアウトできない。
- form-based では session.invalidate() でログアウトする
- SSL+client証明書では?
権限の確認
SingleSignOn 確認
- conf/server.xml の <host> に SingleSignOn 設定を追加
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
SingleSignOn設定がない場合
- http://localhost:28080/servlets-examples/show_user.jsp
- ログインが必要
- http://localhost:28080/servlets-examples/show_user.jsp
- 別途ログインが必要
SingleSignOn設定がある場合
- http://localhost:28080/servlets-examples/show_user.jsp
- ログインが必要
- request.getRemoteUser(): tomcat
- session.getId(): DC8A5622659C179B4E0264507B6BAD7F
- http://localhost:28080/servlets-examples/show_user.jsp
- ログインの必要なし
- request.getRemoteUser(): tomcat
- session.getId(): 99E4191E17B140C8BDFE2A12CAB94CF5
- Webアプリケーション間での認証の引継ぎが発生している
セッションタイムアウト時
- 片方のアプリケーションでセッションがタイムアウトした場合
JDBCDataSource
今後
既存アプリケーションの再構築
認証
共通コードの分離
個別Webアプリケーションのプロジェクト分離
- EDI基盤(ログイン・ユーザー情報・パスワードリマインダ)
- webedi
- 経理
- デジ原
- 検品
新規アプリケーションの構築時の指針作成
- 作成方針・利用方針
- レビュー
- 管理体制
- CVS手順
- 要件定義・開発・テスト・リリース
JDBCStore
- セッションをサーバー間で共有
- Webアプリケーション間では共有できない。
- webアプリケーションが発行するCookie は webアプリケーションに限定されている
- SingleSignOn 機能では別のcookie が発行される
参考
tomcat-4.0 サーバ設定ドキュメント和訳 / Realmコンポーネント
'''一旦ユーザーがうまく認証されるならば、HttpServletRequestインタフェースの以下のメソッドは役に立つ値を返すことになります:'''getRemoteUser() - 認証されたユーザーのユーザー名を返すことになります。
- tomcat-5.5 ドキュメントでは該当する文書なし。英文でも該当なし。
Java Servlet Specification 2.4
- Java サーブレット仕様書 2.4
- http://java.sun.com/products/servlet/download.html より PDF ダウンロード