Предупреждение: JACC: для шаблона URL xxx были обнаружены все методы, кроме следующих: POST, GET.

В документах javax.faces.webapp.FacesServlet упоминается,

Допустимые методы HTTP

Спецификация JSF требует использования только HTTP-методов GET и POST. Если вашему веб-приложению не требуются какие-либо другие методы http, такие как PUT и DELETE, рассмотрите возможность ограничения допустимых методов http с помощью элементов <http-method> и <http-method-omission>. Дополнительную информацию об использовании этих элементов см. в разделе «Безопасность спецификации сервлета Java».


Мое приложение действительно не зависит от других методов HTTP (кроме GET и POST). Поэтому я пытаюсь использовать <http-method> (или <http-method-omission>), чтобы исключить все методы, кроме GET и POST.

В файле web.xml ограничения безопасности сервлета JAAS настроены следующим образом.

<security-constraint>
    <display-name>AdminConstraint</display-name>
    <web-resource-collection>
        <web-resource-name>ROLE_ADMIN</web-resource-name>
        <description/>
        <url-pattern>/admin_side/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>
        <description/>
        <role-name>ROLE_ADMIN</role-name>
    </auth-constraint>
    <user-data-constraint>
        <description/>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

<security-constraint>
    <display-name>UserConstraint</display-name>
    <web-resource-collection>
        <web-resource-name>ROLE_USER</web-resource-name>
        <description/>
        <url-pattern>/user_side/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>
        <description/>
        <role-name>ROLE_USER</role-name>
    </auth-constraint>
    <user-data-constraint>
        <description/>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

Используя эти элементы,

<http-method>GET</http-method>
<http-method>POST</http-method>

Я ожидаю, что все другие методы HTTP запрещены.


Однако GlassFish Server 4.1 регистрирует следующие предупреждения на терминале сервера.

Предупреждение: JACC: для шаблона URL /user_side/* были обнаружены все методы, кроме следующих: POST, GET.

Предупреждение: JACC: для шаблона URL /admin_side/* были обнаружены все методы, кроме следующих: POST, GET

Что это означает?


Кроме того, вместо того, чтобы делать это во всех элементах <security-constraint>, можно ли это настроить глобально, чтобы его можно было применять ко всем ресурсам в приложении и чтобы все HTTP-запросы, кроме GET и POST, можно было опустить, т.е. применить глобально к приложению - возможно, с помощью более обобщенный специализированный шаблон URL, например /*?


Пример приведен здесь.

<security-constraint>
    <display-name>WebConstraint</display-name>

    <web-resource-collection>
        <web-resource-name>test</web-resource-name>
        <description/>
        <url-pattern>/test.jsp</url-pattern>
        <http-method>POST</http-method>
        <http-method>HEAD</http-method>
        <http-method>PUT</http-method>
        <http-method>OPTIONS</http-method>
        <http-method>TRACE</http-method>
        <http-method>DELETE</http-method>
    </web-resource-collection>

    <auth-constraint>
        <description/>
        <role-name>dev</role-name>
     </auth-constraint>
</security-constraint>

вышеприведенный элемент указывает, что ресурс, на который ссылается шаблон URL /test.jsp, при доступе всеми http-методами, кроме GET , должен быть ограничен для просмотра только аутентифицированными пользователями, принадлежащими к роли dev. Обратите внимание, что ограничение безопасности не применяется к http-методу GET, а только к другим методам (POST, HEAD, PUT и т. д.).

Я нашел последнее предложение в сильном тексте сбивающим с толку. Означает ли это, что при использовании запроса GET ресурсы, перечисленные в заданном URL-шаблоне, также доступны анонимным пользователям, потому что это означает: " ограничение безопасности не применяется к http-методу GET"?


person Tiny    schedule 11.12.2014    source источник
comment
JAAS security constraints are configured as follows. - это не ограничения безопасности JAAS, а ограничения безопасности сервлета.   -  person Arjan Tijms    schedule 15.12.2014


Ответы (1)


Что это означает?

Это означает, что все методы, кроме GET и POST, не покрыты, то есть незащищены. Каждый может получить доступ к шаблону URL /user_side/* с помощью таких методов, как PUT и HEAD, без аутентификации.

Для защиты других методов добавьте следующее:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>protected</web-resource-name>
        <url-pattern>/user_side/*</url-pattern>
        <http-method-omission>GET</http-method-omission>
        <http-method-omission>POST</http-method-omission>
    </web-resource-collection>
    <auth-constraint/>
</security-constraint>

Если вы используете Servlet 3.1, вы также можете использовать более короткий тег:

<deny-uncovered-http-methods/>

Кроме того, вместо того, чтобы делать это во всех элементах, можно ли это настроить глобально, чтобы его можно было применять ко всем ресурсам в приложении и чтобы все HTTP-запросы, кроме GET и POST, можно было опустить, т.е. применить глобально к приложению - возможно, с помощью более обобщенный шаблон URL-адреса, например /*?

Да, это возможно. Вы можете использовать шаблон URL-адреса / для включения всех подпапок.

Я нашел последнее предложение в сильном тексте сбивающим с толку. Означает ли это, что с помощью запроса GET ресурсы, перечисленные в данном шаблоне URL-адреса, также могут быть доступны анонимным пользователям, поскольку это означает, что «ограничение безопасности не применяется для http-метода GET»?

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

См. также:

person unwichtich    schedule 12.12.2014
comment
Я использовал <deny-uncovered-http-methods/>, так как я на Servlet 3.1. Уровень журнала был снижен до INFO, и после внесения этих изменений в журнал записывались различные сообщения, например: Info: JACC: For the URL pattern /user_side/*, all but the following methods have been excluded: POST,GET. Я предполагаю, что это безопасное сообщение и что я все сделал правильно :) Хорошие выводы. Спасибо. - person Tiny; 12.12.2014