dotcloud の jetty で BASIC 認証する方法

JavaJavascript の違いについてうまく説明出来ない 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 認証〜。