2011年12月12日月曜日

jetty8でBASIC認証

jettyでBASIC認証する必要があったので忘れずメモ。

jetty側の設定


まず認証レルムの設定ファイルを用意する。
用意すると言ってもデフォルトで$JETTY_HOME/etc/realm.propertiesが存在するのでこちらを利用する。
下記のフォーマットで記述する。
username: password[,rolename ...]
暗号化する場合は種類に応じてOBF:、MD5:、CRYPT:のプレフィックスを付与する。
暗号化する場合は下記のようにして生成する。
$ java -cp lib/jetty-xxx.jar:lib/jetty-util-xxx.jar org.mortbay.jetty.security.Password ユーザー名 パスワード
しかし、なぜか$JETTY_HOME/lib内にorg.mortbay.jetty.security.Passwordクラスが見つからなかったので
下記2つをダウンロードして生成する。
$ cd <workディレクトリ>
$ wget http://www.java2s.com/Code/JarDownload/jetty-core-6.1.14.jar.zip
$ wget http://www.java2s.com/Code/JarDownload/jetty-util-6.1.18.jar.zip
$ unzip jetty-core-6.1.14.jar.zip
$ unzip jetty-util-6.1.18.jar.zip
$ java -cp jetty-core-6.1.14.jar:jetty-util-6.1.18.jar org.mortbay.jetty.security.Password jetty password
password
OBF:1v2j1uum1xtv1zej1zer1xtn1uvk1v1v
MD5:5f4dcc3b5aa765d61d8327deb882cf99
CRYPT:je5/ATIGzeDQw

続いてjetty.xmlに認証レルムを使用する設定を追記する。
<Configure id="Server" class="org.eclipse.jetty.server.Server">
…
    <Call name="addBean">
      <Arg>
        <New class="org.eclipse.jetty.security.HashLoginService">
          <Set name="name">User Realm</Set>
          <Set name="config">
            <!-- 上記で用意した認証レルムの設定ファイルを指定 -->
            <SystemProperty name="jetty.home" default="."/>/etc/realm.properties
          </Set>
          <Set name="refreshInterval">0</Set>
        </New>
      </Arg>
    </Call>
…
</Configure>
Webアプリケーション毎に認証レルムを指定したい場合は下記のようにする。
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
  <Set name="contextPath">/jetty</Set>
  <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/jetty</Set>
…
  <Get name="securityHandler">
    <Set name="loginService">
      <New class="org.eclipse.jetty.security.HashLoginService">
            <Set name="name">User Realm</Set>
            <Set name="config">
              <SystemProperty name="jetty.home" default="."/>/etc/realm.properties
            </Set>
      </New>
    </Set>
  </Get>
…
</Configure>

Webアプリケーション側の設定


web.xmlにBASIC認証用の設定を追記する。
<web-app…
…
  <security-constraint>
    <web-resource-collection>
      <web-resource-name>Authentication of BASIC</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 Realm</realm-name>
  </login-config>
  <security-role>
    <role-name>admin</role-name>
  </security-role>
…
</web-app>
ちなみに$JETTY_HOME/etc/webdefault.xmlに記述すれば一律で設定可能。

0 件のコメント:

コメントを投稿