2016-06-30 5 views
1

У меня есть Java веб-приложение, которое использует web.xml для настройки его безопасности:web.xml ограничение безопасности на контекстно-корень не применяется

<security-constraint> 
    <web-resource-collection> 
     <web-resource-name>webPages</web-resource-name> 
     <description>All web resources</description> 
     <url-pattern></url-pattern> 
     <url-pattern>/admin/*</url-pattern> 
     <http-method>POST</http-method> 
     <http-method>GET</http-method> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>admins</role-name> 
    </auth-constraint> 
    <user-data-constraint> 
     <description>SSL not required</description> 
     <transport-guarantee>NONE</transport-guarantee> 
    </user-data-constraint> 
</security-constraint> 

Я хочу, чтобы все страницы в/админ/* должны быть защищены , и это работает. пользователь правильно сначала видит loginscreen и затем перенаправляется на исходную запрошенную страницу.

Я бы также хотел, чтобы мой контекстный корень был защищен: http://host:port/context/ Однако, когда я настраиваю шаблон <url-pattern></url-pattern> и делаю запрос к корню, мой java-контроллер только начинает работать и отображает представление, не видя окна входа в систему. Почему этот шаблон работает для таких вещей, как <servlet-mapping> (чтобы отобразить запрос на весенний сервлет), но не как ограничение безопасности?

Я столкнулся как с хромом, так и с firefox и перезапустил несколько раз.

+0

ли вы использовать/* для конфигурации корневого контекста? – aksappy

+0

@aksappy Нет, потому что/* как шаблон url означает «поймать все запросы», я не хочу этого, только корневой контекст. Например, /otherpage.do следует продолжать работать без разрешения. – user1884155

+0

Согласно спецификации, вы сделали правильно. – aksappy

ответ

0

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

Here is a better answer с примером, но в вашем случае должно быть что-то вроде этого:

<security-constraint> 
    <web-resource-collection> 
    <web-resource-name>webPages</web-resource-name> 
    <description>All web resources</description> 
    <url-pattern>/</url-pattern> 
    <http-method>POST</http-method> 
    <http-method>GET</http-method> 
    </web-resource-collection> 
    <auth-constraint> 
    <role-name>admins</role-name> 
    </auth-constraint> 
    <user-data-constraint> 
    <description>SSL not required</description> 
    <transport-guarantee>NONE</transport-guarantee> 
    </user-data-constraint> 
</security-constraint> 
<security-constraint> 
    <web-resource-collection> 
    <web-resource-name>Public Resources</web-resource-name> 
    <url-pattern>/public/*</url-pattern> 
    <url-pattern>/alsopublic</url-pattern> 
    <url-pattern>...an so on...</url-pattern> 
    </web-resource-collection> 
    <!-- to given public access don't set auth-constraint--> 
</security-constraint> 

Edit: Ссылка на servlet 3 specification

+0

Это не работает. Сервер правильно знает, что root теперь «защищен», но когда он пытается перенаправить на страницу входа, расположенную в /login.do, я думаю, что этот запрос блокируется. Через несколько секунд я получаю сообщение об ошибке на сервере, говорящее, что было создано максимальное количество потоков, что указывает на бесконечный цикл. Кроме того, ваша ссылка на сервлет 3 спецификации не работает для меня: я не уполномочен выполнять этот запрос, кажется. – user1884155

+0

Я не понимаю твой комментарий: ¿/ защитить корень только так, как должен ?. Также укажите, что /login.do делает после входа в систему пользователя (например, который перенаправляет). – Guillermo

+0

, объявляя /, он также сохраняет все мое другое содержимое, а не только корень. Я думаю, что это/не является надлежащим способом описания корня контекста. Согласно сервлет 3.0, правильный шаблон url - это пустая строка. – user1884155