dotcloud の jetty で BASIC 認証する方法
Java と Javascript の違いについてうまく説明出来ない Java エンジニアのソメダです、こんにちは。
さて、同僚の id:dragon3 さんも「dotcloud 手軽でよかばい」と言っているので、今週の関ジャバカンファレンス2011のデモ環境を、dotcloud 上でコツコツと作ってます。
こういった環境はプレゼン終わるまでは見られたくないですし、今回はネタが AWS なだけに、課金に関わる機能もあるので開けっ放しにはしづらいモノ。とはいえ、デモ用のアプリに認証の仕組みを組むのもなぁ、という気持ちもある訳です。で、そんな時は BASIC 認証が「手軽でよかばい」なのですが、Java の場合コンテナ側の設定が必要なので、そもそも dotcloud 環境の jetty で出来るの?と思って調べたのが発端です。
結論でいうと、今の所(2011年7月時点) dotcloud 環境の jetty で BASIC 認証かけれます。今回の環境は前のエントリでの環境を前提にします。準備するものは三つ。
- dotcloud 上に jetty の設定ファイルを作成
- 認証情報を保存するファイルの作成
- web.xml に security-constraints 追加
以下で一つずつみていきます。
dotcloud 上に jetty の設定ファイルを作成
まず、ssh で指定の環境にログインして、
dotcloud ssh kanjava.www
ホーム (/home/dotcloud) 直下にある contexts ディレクトリに以下のようなファイルを作ります。名前は何でも良いですが、context.xml としておきます。
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd"> <Configure class="org.mortbay.jetty.webapp.WebAppContext"> <Set name="contextPath">/</Set> <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/ROOT.war</Set> <Get name="securityHandler"> <Set name="userRealm"> <New class="org.mortbay.jetty.security.HashUserRealm"> <Set name="name">User Auth</Set> <Set name="config"><SystemProperty name="jetty.home" default="."/>/webapps/realm.properties</Set> </New> </Set> </Get> </Configure>
やっていることは、指定の Context (上記では ROOT.war) に、webapps/realm.properties を使った Realms を追加しますよ、ということ。詳細は以下あたりを参考に。
認証情報を保存するファイルの作成
context.xml で指定した realm.properties を作ります。こちらは、dotcloud 上で作ってもよいのですが、都度変更とかしたいのでローカルで作成しておいて、dotcloud push する際に war ファイルと一緒にあげることとします。以下では kanjava ユーザをパスワードは「password」、ロールを「admin」にしてます。
kanjava: password,admin
こちら、MD5 などでも保存できますが、詳細は以下で。
web.xml に security-constraints 追加
いつものやつです。web.xml の最後の方にソロリと追加します。
<security-constraint> <web-resource-collection> <web-resource-name>User Auth</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>admin</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>BASIC</auth-method> <realm-name>User Auth</realm-name> </login-config> <security-role> <role-name>admin</role-name> </security-role>
配備
ここまで準備出来たら、後は realm.properties も一緒に dotcloud push するだけです。
mvn clean package
mkdir -p target/dist
cp -pr target/ROOT.war target/dist
cp -pr dotcloud.yml target/dist
cp -pr realm.properties target/dist
dotcloud push kanjava target/dist
レッツ BASIC 認証〜。