4

web.xml に次のものがあるwebappの場合testapp(とりわけ)

<security-constraint>
    <web-resource-collection>
        <web-resource-name>My JSP</web-resource-name>
        <url-pattern>*.secured</url-pattern>
        <url-pattern>/login</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
    </web-resource-collection>

    <auth-constraint>
        <role-name>mobileusers</role-name>
    </auth-constraint>
    <!--
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
    -->
</security-constraint>

<login-config>
    <auth-method>DIGEST</auth-method>
    <realm-name>Identity</realm-name>
</login-config>

<security-role>
    <description>
        No Description
    </description>
    <role-name>mobileusers</role-name>
</security-role>

次の 2 つの Tomcat レルム構成を検討してください。

構成 1 - JDBC レルム:

.../webapps/testapp/META-INF/context.xml

<Realm  className="org.apache.catalina.realm.JDBCRealm" 
        driverName="com.mysql.jdbc.Driver"
        connectionName="mysqluser"
        connectionPassword="redacted"
        connectionURL="jdbc:mysql://192.168.1.5/testdb?autoReconnectForPools=true&amp;characterEncoding=UTF-8"
        digest="MD5"
        userTable="Users" 
        userNameCol="name" 
        userCredCol="password"
        userRoleTable="Users" 
        roleNameCol="roleName"
/>

構成 2 - データソース レルム:

.../webapps/testapp/META-INF/context.xml

<Realm  className="org.apache.catalina.realm.DataSourceRealm" 
        digest="MD5"
        userTable="Users" 
        userNameCol="name" 
        userCredCol="password"
        userRoleTable="Users" 
        roleNameCol="roleName"
        dataSourceName="jdbc/testDB"
/>

そしてで.../conf/context.xml

<Resource 
    name="jdbc/testDB" 
    auth="Container" 
    type="javax.sql.DataSource" 
    removeAbandoned="true" 
    removeAbandonedTimeout="15" 
    maxActive="5" 
    maxIdle="5" 
    maxWait="7000" 
    username="mysqluser"
    password="redacted"
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://192.168.1.5/testdb?autoReconnectForPools=true&amp;characterEncoding=UTF-8"
    factory="com.mycompany.util.configuration.customfactory"
    validationQuery="SELECT '1';"
    testOnBorrow="true"/>

はっきりしない理由により、構成 1 は機能しますが、構成 2 は機能しません。構成 2 の Context.xml リソースを使用して、あらゆる場所でコード内の MySQL に接続していることに注意してください。これはうまく機能します。ただし、Tomcat レルムがそれを使用しようとすると、構成 1 と同じことを行っているように見えても、認証は常に失敗します。

これがなぜなのか、誰にも洞察がありますか?

4

1 に答える 1

10

DataSource が別の場所 (サーブレットなど) で動作していると仮定するとlocalDataSource="true"、Realm が次のようになるように Realm 宣言に追加するだけで済みます。

<Realm  className="org.apache.catalina.realm.DataSourceRealm"
    localDataSource="true"
    digest="MD5"
    userTable="Users" 
    userNameCol="name" 
    userCredCol="password"
    userRoleTable="Users" 
    roleNameCol="roleName"
    dataSourceName="jdbc/testDB"
/>

少なくとも、それが私にとってはうまくいきました。

完全に言うと、100% 明確にするために、このパラメーターの名前にもかかわらず、DataSource を Webapp の context.xml 内に配置したくない場合は、配置する必要はありません。サーバーのコンテキスト XML は正常に機能します。

于 2012-12-06T01:16:46.367 に答える