Сопоставьте шаблон URL-адреса причала только с корневым каталогом

Я хотел бы защитить паролем только корневой каталог на моем контекстном пути для Jetty WebApp. Мой контекстный путь — /MyApp, поэтому я хотел бы потребовать пароль для доступа:

http://localhost:8080/MyApp

Но НЕ для:

http://localhost:8080/MyApp/cometd

Моя текущая настройка приведена ниже (обратите внимание на шаблон URL):

<security-constraint>   
    <web-resource-collection>
        <web-resource-name>Private Page</web-resource-name>
            <url-pattern>/</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>moderator</role-name>
    </auth-constraint>
</security-constraint>

<login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>Test Realm</realm-name>
</login-config>

Я ожидаю, что это будет работать только по характеру работы / и /* в целом. Я также видел этот ресурс, который, как мне кажется, предполагает, что это должно в значительной степени работать: http://www.coderanch.com/t/364782/Servlets/java/there-key-difference-between-URL

Однако для моего случая шаблоны URL:

<url-pattern>/</url-pattern>

а также

<url-pattern>/*</url-pattern>

похоже, действуют одинаково: оба

http://localhost:8080/MyApp 

а также

http://localhost:8080/MyApp/cometd

ОБА защищены паролем.

Конечно, если я перейду на /nothingishere, просто для проверки работоспособности, ничто не будет защищено паролем, кроме /MyApp/nothingishere.

Кто-нибудь знает, как защитить только корневой каталог для веб-сервлетов?


person Drewch    schedule 16.07.2012    source источник


Ответы (1)


Вот ответ для вас:

<?xml version="1.0" encoding="UTF-8"?>

<web-app 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"
        version="3.0">
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <security-constraint>   
        <web-resource-collection>
            <web-resource-name>Private Page</web-resource-name>
            <url-pattern>/</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>moderator</role-name>
        </auth-constraint>
    </security-constraint>
    <security-constraint>   
        <web-resource-collection>
            <web-resource-name>Public page</web-resource-name>
            <url-pattern>/test/*</url-pattern>
        </web-resource-collection>        
    </security-constraint>
    <login-config>
        <auth-method>BASIC</auth-method>
        <realm-name>Test Realm</realm-name>
    </login-config>
</web-app>

В этой конфигурации корневой каталог защищен паролем, а каталог /test/... — нет. Я думаю, это то, о чем вы просите.

Эта конфигурация протестирована на Tomcat 7+ и новом проекте, созданном с самого начала в NetBeans (я могу отправить вам весь исходный код по электронной почте, если он вам нужен).

Это вывод: output

person MaVRoSCy    schedule 18.07.2012
comment
Спасибо, это именно то, что я искал. - person Drewch; 19.07.2012
comment
У меня тоже работает :) Я награжу награду, как только истекут 24 часа. - person Adrian Petrescu; 19.07.2012
comment
конечно, этот ответ не только для причала, но и для всех веб-серверов, совместимых с j2ee. Так что, возможно, вы захотите изменить заголовок... Кстати, рад, что помог - person MaVRoSCy; 19.07.2012
comment
Есть ли способ, который не требует белого списка всех подпутей? - person Usman Ismail; 16.10.2014
comment
т. е. все подпути должны быть незащищенными с необходимостью добавлять ограничение безопасности для них один за другим. - person Usman Ismail; 17.10.2014