dreamedge.net

Basic認証をする

2008-06-17T03:49:00+0000

server.xml, web.xml, tomcat-users.xmlの3つを変更しないといけなく,IP制限と比べてえらく面倒.

1. まずは/etc/tomcat5/server.xmlのEngine, Host, Contextタグの子要素として,Realmタグを設定する.デフォルトでEngineタグの子要素として記述されているので,基本的に変更しなくても大丈夫.

<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
       debug="0"
       resourceName="UserDatabase" />

2. 次にGlobalNamingResourcesタグの子要素にResourceタグとResourceParamsタグを書いて,UserDatabaseの設定をする.これもすでに記述されていると思うので,pathnameのところでtomcat-users.xmlのパスを指定する位.デフォルトでは$CATALINA_HOME/conf/tomcat-users.xmlを見に行くことになっている.Debian的には/etc/tomcat5/tomcat-users.xml辺りに設定した方がよいような気がして変えてみたのだけど,”java.io.FileNotFoundException: /etc/tomcat5/tomcat-users.xml.new (Permission denied)”って怒られてうまくいかなかった.何で?

<Resource name="UserDatabase" auth="Container"
          type="org.apache.catalina.UserDatabase"
          description="User database that can be updated and saved">
</Resource>
<ResourceParams name="UserDatabase">
  <parameter>
    <name>factory</name>
    <value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>
  </parameter>
  <parameter>
    <name>pathname</name>
    <value>conf/tomcat-users.xml</value>
  </parameter>
</ResourceParams>

3. 上で設定したtomcat-users.xmlにrolename, username, passwordを設定する.基本的にはrolenameはbasicあたりを設定するのが分かりやすいのではないかと思います.デフォルトでいくつか作られているので,それをちょっといじって使ってもいいんじゃないでしょうか.

<tomcat-users>
  <role rolename="basic"/>
  <user username="user" password="passwd" roles="basic"/>
</tomcat-users>

4. 最後に/etc/tomcat5/web.xmlに実際に認証をかけるパス等の設定をする.web-appタグの子要素として,security-constraintタグとlogin-configタグを作成して,必要な部分を書き込む.\<url-pattern\>が認証をかけるURLの指定,\<auth-constraint\>が許可するrolenameの指定,\<auth-method\>が認証方式(今回はBASIC認証)の指定.

<security-constraint>
  <web-resource-collection>
    <web-resource-name>
      Authentication
    </web-resource-name>
    <url-pattern>/*</url-pattern>
  </web-resource-collection>
  <auth-constraint>
    <role-name>basic</role-name>
  </auth-constraint>
</security-constraint>

<login-config>
  <auth-method>BASIC</auth-method>
  <realm-name>UserDatabaseRealm</realm-name>
</login-config>

5. あとは再起動すれば設定完了.
IP制限に比べて格段にややこしい設定になるのは何なんだろう.宇宙意志とかの仕業なんだろうか…….(なにやら拡張性とか云々とかに関するJavaの仕様らしい.)