Ограничение безопасности Web.xml для корневого контекста не применяется

У меня есть веб-приложение java, которое использует 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>

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

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

Я пробовал как в Chrome, так и в Firefox и перезапускал несколько раз.


person user1884155    schedule 30.06.2016    source источник
comment
Вы использовали /* для конфигурации корневого контекста?   -  person aksappy    schedule 30.06.2016
comment
@aksappy Нет, потому что /* в качестве шаблона URL-адреса означает перехватывать все запросы, я этого не хочу, только корневой контекст. Например, /otherpage.do должен продолжать работать без авторизации.   -  person user1884155    schedule 30.06.2016
comment
Согласно спецификации, то, что вы сделали, правильно.   -  person aksappy    schedule 30.06.2016


Ответы (1)


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

Вот лучший ответ с примером, но в вашем случае должно быть что-то вроде этого:

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

Изменить: ссылка на спецификация сервлета 3

person Guillermo    schedule 02.07.2016
comment
Это не работает. Сервер правильно знает, что корень теперь защищен, но когда он пытается перенаправить на страницу входа, расположенную в /login.do, я думаю, что этот запрос блокируется. Через несколько секунд я получаю сообщение об ошибке на сервере о том, что создано максимальное количество потоков, что указывает на бесконечный цикл. Кроме того, ваша ссылка на спецификации сервлета 3 у меня не работает: похоже, я не уполномочен выполнять этот запрос. - person user1884155; 04.07.2016
comment
Я не понимаю вашего комментария: ¿‹url-pattern›/‹/url-pattern› защищают корень только так, как должны? Также укажите, что /login.do делает после входа пользователя (например, что перенаправляет). - person Guillermo; 04.07.2016
comment
объявив /, он также защищает весь мой другой контент, а не только корень. Я думаю, что это / не правильный способ описать корень контекста. Согласно сервлету 3.0, правильным шаблоном URL является пустая строка. - person user1884155; 05.07.2016