5

ユーザー (サイトへのログオンが許可されている) が MySQL データベースから読み込まれるようにしたいと考えています。そのために、Apache Tomcat 7 アプリケーション サーバー用に JDBCRealm をセットアップします。

ドキュメントを読み、JNDI リソース (jdbc/foo4) を使用してデータベース接続を作成しました。このリソースは機能します (アプリケーションで既に使用してデータを取得しています)。機能していないように見えるのは、レルムとこのリソースのリンクです。

私の構成ファイルは次のようになります。

src\main\webapp\META-INF\context.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/my-webapp">
  <!-- works! -->
  <Resource name="jdbc/foo4"
            type="javax.sql.DataSource"
            factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
            driverClassName="com.mysql.jdbc.Driver"
            url="jdbc:mysql://localhost:3306/foo4"
            username="root"
            password="root"
            maxActive="8" 
            maxIdle="4" 
            maxWait="10000"
            auth="Container"
          />
  <!-- Does not seem to work?! -->
  <Realm className="org.apache.catalina.realm.DataSourceRealm"
         dataSourceName="jdbc/foo4"
         userTable="users" 
         userNameCol="user_name" 
         userCredCol="user_pass"
         userRoleTable="user_roles" 
         roleNameCol="role_name"/>
</Context>

私の標準配備記述子では、次のように入力しました。

src\main\webapp\WEB-INF\web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <security-constraint>
    <display-name>General Restriction</display-name>
    <web-resource-collection>
      <web-resource-name>Entire Application</web-resource-name>
      <description>All resources in this application are protected.</description>
      <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>admin</role-name>
    </auth-constraint>
  </security-constraint>
  <login-config>
    <auth-method>FORM</auth-method>
    <realm-name>Administration Area</realm-name>
    <form-login-config>
      <form-login-page>/login.jsp</form-login-page>
      <form-error-page>/error.jsp</form-error-page>
    </form-login-config>
  </login-config>
  <security-role>
    <role-name>admin</role-name>
  </security-role>
  <resource-ref>
    <res-ref-name>jdbc/foo4</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>
</web-app>

そして、この SQL スクリプトを使用してサンプル ユーザーを作成しました。

セキュリティ.sql

create table users ( user_name varchar(15) not null 主キー、 user_pass varchar(15) not null );

create table user_roles ( user_name varchar(15) not null,
role_name varchar(15) not null, primary key (user_name, role_name) );

INSERT INTO users(user_name,user_pass)VALUES('benny','test'); INSERT INTO user_roles(user_name,role_name)VALUES('benny','admin');

しかし、ユーザー「benny」とパスワード「test」でログインできません。ユーザー「tomcat」とパスワード「tomcat」でログインできますが (%CATALINA_HOME%\conf\tomcat-users.xml で定義されているため)、MySQL データベースから自分のユーザーでログインできません。

もちろん、Tomcat サーバーは MySQL ドライバーを使用しています ("mysql-connector-java-5.1.9.jar" を %CATALINA_HOME%\lib に配置しました)。

ログインしようとすると、次のエラー メッセージが表示されます。

Sep 08, 2012 7:38:55 PM org.apache.catalina.realm.DataSourceRealm open
Exception performing authentication
javax.naming.NameNotFoundException: Name [jdbc/foo4] is not bound in this Context. Unable to find [jdbc].

誰かがエラーを見ますか?

4

1 に答える 1

11

レルムはデフォルトで常にグローバルデータソース(のTomcat側で構成されている/conf/server.xml)を検索しますが、ローカルデータソース(まったく同じでwebapp側で構成されている)を定義している/META-INF/context.xmlため、レルムはデータソースを見つけることができません。localDataSource属性をに設定する必要がありますtrue

<Realm ... localDataSource="true" />

Tomcat7.0Realmのドキュメントも参照してください。

localDataSource

レルムがContext要素内にネストされている場合、これにより、レルムはグローバルデータソースではなく、コンテキストに対して定義されたデータソースを使用できます。指定しない場合、デフォルトはfalse次のとおりです。グローバルデータソースを使用します。

于 2012-09-08T17:50:52.907 に答える