QA@IT

TOMCATで設定するBASIC認証の失敗する原因

17812 PV

お世話になっております。
以下の条件で、RegistInput.jspというviewに遷移するタイミングの時に、
BASIC認証をセットしました。
しかし、認証ダイアログは出るのですが、Tomcatのtomacat-user.xmlでセットした
IDとPWで認証失敗します。3回失敗したところで、
「HTTPステータス 401 This request requires HTTP authentication」が出てきます。
ネットで色々検索してTRYしてたんですが、どうしても結果はERRORになってしまいます。
行き着いたところが、下記の設定です。
どこが違うか、どなたかご教授宜しくお願い致します。

環境

Win 7 64bit
eclipse4.2
Tomcat 7 
struts 2.3.16
JDK7

TOMCAT_HOME/conf/server.xml(BASIC認証設定部のみ抜粋)

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

<Resource name="UserDatabase"   
    auth="Container" type="org.apache.catalina.UserDatabase"
    description="User database that can be updated and saved" />

<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>

TOMCAT_HOME/conf/tomcat-user.xml(BASIC認証設定部のみ抜粋)

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

projyct配下のweb.xml(BASIC認証設定部のみ抜粋)

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Authentication of BasicAuth</web-resource-name>
        <url-pattern>/RegistInput.jsp</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>
<security-role>
    <role-name>basic</role-name>
</security-role>
  • コメントに追記しました。 -

回答

Server.xmlで

<ResourceParams name="UserDatabase>

にダブルクォートが不足しているようです。

ただこの状態でサーバーが起動できているのが疑問なんですが、正しいServer.xml直してますか?
たとえばeclipseで起動しているのにローカルの他箇所のTomcatの設定変更していたりしてませんか?


参考までに載せておきます。コメントは削除しています。

  • eclipse pleiades 4.3 ultimate
  • Tomcat 7 (pleiades 付属のxamppのもの。ただし server.xmlとtomcat-users.xmlはeclipseプロジェクトのServers(Basic認証に関する部分は修正)配下のもの)

なお<Realm className="org.apache.catalina.realm.LockOutRealm">〜</Realm>はたしか元からあったので足していない。

server.xml

<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
  <Listener SSLEngine="on" className="org.apache.catalina.core.AprLifecycleListener"/>
  <Listener className="org.apache.catalina.core.JasperListener"/>
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>

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

  <Service name="Catalina">
    <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>
    <Engine defaultHost="localhost" name="Catalina">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
      </Realm>

      <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="localhost_access_log." suffix=".txt"/>
      <Context docBase="QaitStruts3381" path="/QaitStruts3381" reloadable="true" source="org.eclipse.jst.jee.server:QaitStruts3381"/></Host>

<Resource name="UserDatabase"
    auth="Container" type="org.apache.catalina.UserDatabase"
    description="User database that can be updated and saved" />

<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>

    </Engine>
  </Service>
</Server>

tomcat-users.xml

<?xml version="1.0" encoding="UTF-8"?>
<tomcat-users>
  <role rolename="basic" />
  <user username="qait" password="qait" roles="basic"/>"
</tomcat-users>

web.xml

〜前半省略〜

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Authentication of BasicAuth</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>
<security-role>
    <role-name>basic</role-name>
</security-role>
</web-app>
編集 履歴 (2)
  • flied_onionさん、この度も有り難うございます。
    念のためTomcat7を再度インストールし直して、server.xml書き換えましたが(<ResourceParams name="UserDatabase">として)、現象はかわりありません。引き続き調査しております。
    -
  • ちなみに「eclipseで起動しているのにローカルの他箇所のTomcatの設定変更」とは具体的にどこを変更した場合なんでしょうか・・・教えていただければ幸いです。 -
  • あなたが今どのように動作確認しているかによりますが、eclipseは開発用にTomcatをインストールしてくれたり、インストールされているTomcatを利用する場合でも開発用のserver.xmlなどを用意してそちらで起動してくれたりします。そういった場合にインストール先のTomcatのserver.xmlをいじっても効果がありません。 -
  • eclipseを終了した状態で動作してるのであればそのserver.xmlファイルで大丈夫かもしれません。
    ただ、ダブルクォートがなかった状態で動いていたのだとしたら(エラーでTomcatが起動しなさそうだなって思うので)、反映されてないとか編集してるファイルが違うとかいう可能性もあるかもしれませんねっていう話です。
    -
  • 他の設定の変更が反映されてるとか、そのファイルで間違いなければ、この話は無視して構いません。 -
  • flied_onionさん、有り難うございます。Tomcat7を再インストールし、連携してたApache2.2も再インストールし、server.xmlの<ResourceParams name="UserDatabase">も修正して、現状かわりません。ダブルクォートがなかった状態で動かないようにもなりました。
    現在、お手上げ状態で、次にどうするか考えております。
    -
  • まずはパターンを/*にしてただのHTMLにアクセスするようにしてBasic認証がクリアできるか試してみては?
    -
  • TOMCATを再インストールするよりも、もっと単純なアプリケーションで試してみるなどした方がいいでしょう。 -
  • パターンを/*にしてTOP画面にBASIC認証かけたのですが、認証失敗します。
    ちなみに、"UserDatabase"というのは文字どうり「UserDatabase」であって、接続している環境のデータベースの名前を記述するわけではありませんよね・・・?はずかしい質問ですみません。
    -
  • Apacheを経由せずTomcatに直接アクセスして試してるんですよね?
    -
  • 回答に追記した設定で簡単に確認した範囲では動作はしました。最後までBasic認証でやるつもりがないならキリのいいところで次に進むのもいいかと思います。あんまり粘ってまで達成させるようなものではないですし。
    -
  • flied_onionさん、追記有り難うございます。Apacheを経由せずTomcatに直接アクセスしております。 -
  • 正常動作しましたので、回答に記してみます。 -
  • 「これによって開発時はTOMCAT_HOME配下の設定を壊す心配なく開発できるわけです。」・・・ご丁寧にご説明有り難うございます。大変勉強になりました。また何かありましたらお知恵をお貸し下さい。有り難うございました。 -

結果を報告致します。
正常動作いたしました。
変更部分は、flied_onionさんが回答に追記していただいたとうりに、
Eclipse配下のserver.xmlとtomcat-users.xmlを変更したからです。

今まで正常動作しなかった理由は、一生懸命TOMCAT_HOME配下の
server.xmlとtomcat-users.xmlの設定をいじってたからです。

どうしてEclipse配下のserver.xmlとtomcat-users.xmlの設定を変更して正常動作し、
TOMCAT_HOME配下のserver.xmlとtomcat-users.xmlの設定を変更しても無駄なのかは、
現在わかりませんが、これが答えなのかという現実はわかりました。

flied_onionさん、この度も有り難うございました。
御礼申し上げます。

ちなみに、Eclipse配下のserver.xmlはflied_onionさんの記述の以下の部分を

<Context docBase="QaitStruts3381" path="/QaitStruts3381" reloadable="true" source="org.eclipse.jst.jee.server:QaitStruts3381"/>

次のように変更して正常動作しました。(project:私の開発プロジェクトのプロジェクト名)

<Context docBase="project" path="/project" reloadable="true" source="org.eclipse.jst.jee.server:project"/>
編集 履歴 (0)
  • 私の回答のコメントで述べていた通り、eclipseはすでにあるTomcatの設定に影響を与えずに開発ができるように、Tomcat起動時に開発用のserver.xml他のファイルを参照させます。これによって開発時はTOMCAT_HOME配下の設定を壊す心配なく開発できるわけです。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。