Tomcat JDBC и DataSource Realm

Для веб-приложения testapp, в файле web.xml которого есть следующее (среди прочего)

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

Рассмотрим следующие две конфигурации Tomcat Realm:

Конфигурация 1 — область JDBC:

In .../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 — Область источника данных:

In .../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 — нет. Обратите внимание, что мы повсеместно используем ресурс Context.xml из конфигурации 2 для подключения к MySQL в нашем коде, и он отлично работает. Однако, когда Tomcat Realm пытается его использовать, аутентификация всегда завершается ошибкой, даже если кажется, что он делает то же самое, что и Конфигурация 1.

У кого-нибудь есть понимание, почему это может быть?


person Cody S    schedule 05.12.2012    source источник
comment
И я только что понял... это лучший вопрос для сбоя сервера? Я Java-разработчик, поэтому я привык задавать вопросы здесь, но...   -  person Cody S    schedule 05.12.2012
comment
Я пытаюсь воспроизвести конфигурацию 1, но, к сожалению, у меня нет каталога META-INF. Я использовал maven jersey-quickstart-archtype для создания проекта для себя. Что я могу сделать, чтобы создать каталог и context.xml. Или вручную, где я могу разместить этот каталог или создать файл самостоятельно?   -  person Kuldeep Yadav    schedule 26.09.2016
comment
Я не уверен. Как правило, когда вы создаете файл WAR с помощью Maven и распаковываете его, у вас будет каталог META-INF. Если вы хотите добавить в свой проект материал, который будет включен в META-INF, обычно (по моему опыту) вы создаете каталог src/main/webapp/META-INF/ и затем помещаете туда файлы.   -  person Cody S    schedule 26.09.2016
comment
Я пытаюсь настроить область для своего веб-приложения. Пожалуйста помоги. stackoverflow.com/questions/39715453/   -  person Kuldeep Yadav    schedule 27.09.2016


Ответы (1)


Предполагая, что у вас есть 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 внутрь context.xml веб-приложения, если вы этого не хотите; XML контекста сервера будет работать нормально.

person Cody S    schedule 06.12.2012
comment
Обратите внимание, что это также решение для бесполезной ошибки JNDI javax.naming.NameNotFoundException: Name jdbc is not bound in this Context при выполнении аутентификации JAAS с использованием DataSourceRealm. - person bzuillsmith; 06.07.2013
comment
Поскольку использование свойства дайджеста tomcat 8 и выше не будет работать, вместо этого нам нужно включить тег CredentialHandler. - person laksys; 10.04.2020