Apache連携でも同じ! Tomcat6でBasic認証を行うための設定

Apache/Tomcat連携してWebアプリケーションを運用して、Basic認証でアクセス制限をかけることを検討しているとします。


Apache側でかけるのか?
Tomcat側でかけるのか?
あれ?ってなりませんか?


結論からいうと、Tomcat側で仕掛けます。


Apacheでは、80ポートのリクエストで特定URLを、AJPプロトコルTomcatに連携します。
よって、Apache配下のディレクトリを利用しないため、httpd.conf内のDerectoryディレクティブの「AuthType Basic」設定はできません。


というわけで、Tomcat側で仕掛けることになります。
(どやー!って感じでいうことでもないんですが。)


さて、前置きが長くなりましたが、Tomcat6でアプリ毎にBasic認証を行う設定をメモしておきます。

検証環境

OS Linux
Apache Apache/2.2.16 (Unix)
Tomcat Apache Tomcat/6.0.32

Webアプリケーションのweb.xml

(の次あたりに追記)

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>FOR_DEMO</web-resource-name>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>demouser</role-name>
        </auth-constraint>
    </security-constraint>

    <login-config>
        <auth-method>BASIC</auth-method>
        <realm-name>FOR DEMO</realm-name>
    </login-config>

参考:http://www.sk-jp.com/java/servlet/webxml.html

ここで重要なのは、の値です。後述するtomcat-users.xmlと関連付けます。

$TOMCAT_HOME/conf/tomcat-users.xml

<tomcat-users>
  <role rolename="demouser"/>
  <user username="[ユーザ名]" password="[パスワード]" roles="demouser"/>
</tomcat-users>

userタグのroles属性に、web.xmlに設定した値を設定することで関連付けます。


これで完了です。

まとめ

この方法を使うと、アプリケーション毎にBasic認証でアクセス制限をすることができます。
もちろん、Apache2.2/Tomcat6.0連携で名前ベースのVirtualHostを実現する方法 - DISってHONEY♪ @gungnir_odinに書いた方法で、複数ドメインを運用している場合も使用することができるので、使い方の幅が広がりますね。