Как обеспечить базовую проверку подлинности http для статических веб-приложений tomcat без изменения tomcat-users.xml? - PullRequest
10 голосов
/ 11 октября 2011

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

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

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

Спасибо, Юве

Ответы [ 2 ]

9 голосов
/ 14 октября 2011

Я нашел решение здесь: 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>
1 голос
/ 01 августа 2012

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

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

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

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

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

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

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

...