Как предоставить базовую HTTP-аутентификацию для статических веб-приложений tomcat без изменения tomcat-users.xml?

У меня есть доступ к менеджеру tomcat и вы можете загружать военные файлы. Одна из этих войн - статический веб-проект (zip html + media files, переименованный в *.war). Я хочу добавить файл Web-INF/web.xml в эту войну, чтобы защитить контент с помощью основного HTTP-аутентификации.

Я знаю, как это сделать, добавляя глобальных пользователей и назначая роли в tomcat-users.xml, но я хочу иметь все имена пользователей и пароли, определенные в моем военном файле.

  • Можно ли это сделать, не касаясь tomcat tomcat-users.xml?
  • И если да, то как это указать в статическом проекте web.xml?

спасибо, Juve

Ответ 1

Я нашел решение здесь: http://wiki.metawerx.net/wiki/SecuringYourSiteWithContainerManagedSecurity

На странице описывается, как определить собственный META-INF/context.xml указывающий на собственный WEB-INF/users.xml. К сожалению, ссылка на файл users.xml должна быть абсолютной, и я не хочу делать какие-либо предположения о путях ОС/файловой системы в моих файлах конфигурации.

Вот мой текущий WEB-INF/web.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd"
    version="2.5">

    <display-name>SuperCoolTool</display-name>
    <description>What an awesome app!</description>

    <security-role>
        <role-name>manager</role-name>
    </security-role>
    <security-role>
        <role-name>keyuser</role-name>
    </security-role>

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>
                Entire Application
            </web-resource-name>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>keyuser</role-name>
            <role-name>manager</role-name>
        </auth-constraint>
    </security-constraint>

    <login-config>
        <auth-method>BASIC</auth-method>
        <realm-name>Evaluation Area</realm-name>
    </login-config>

</web-app> 

Соответствующий META-INF/context.xml будет выглядеть так:

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <Realm className="org.apache.catalina.realm.MemoryRealm"
           pathname="[PATH-TO-YOUR-WEBAPP]/WEB-INF/users.xml"/>
</Context>

Ответ 2

Если вы знаете каталог, в котором tomcat помещает все развернутые приложения, вы можете использовать относительные пути (потому что они разрешены относительно каталинии .base env.variable, то есть дома tomcat).

Например, если вы развертываете среду разработки eclipse, обычно приложения развертываются в wtpwebapps, поэтому вы можете использовать:

<Realm className="org.apache.catalina.realm.MemoryRealm"
pathname="wtpwebapps/YOUR_APP_NAME/WEB-INF/users.xml"/>

Пока не совершенен, но по крайней мере вы не используете полные пути.

Альтернативой было бы реализовать свое собственное Realm, которое расширяет MemoryRealm и предварительно обрабатывает путь до вызова super.setPathname();

Вы также можете использовать DataSourceRealm, который не имеет этой проблемы и подходит для производства.

Для подхода, не зависящего от контейнера сервлетов, вы можете использовать систему безопасности на основе фильтров (например, Spring security,...)