Несколько ограничений безопасности в web.xml не работают

Я обновляю веб-приложение (Servlet 3.0 / Tomcat 7), которое требует базовой аутентификации на большинстве своих страниц. Это приложение имеет небольшой набор сервлетов мониторинга, ни один из которых не должен быть защищен. В моем web.xmlВ настоящее время у меня есть следующее security-constraint блоки (личная информация заменяется буквами алфавита):

<security-constraint>
    <display-name>Security Constraint</display-name>
    <web-resource-collection>
        <web-resource-name>Protected Area</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>CN=A,OU=B,OU=C,OU=D,DC=E,DC=F</role-name>
    </auth-constraint>
</security-constraint>

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Unprotected Pages</web-resource-name>
        <url-pattern>/health/*</url-pattern>
    </web-resource-collection>
</security-constraint>

На пути "здоровья" есть три конечные точки:

  • /health/monitor/status
  • /health/monitor/version
  • /health/monitor/version/xml

Когда я посещаю любой из version конечные точки, я не запрашиваю учетные данные (как и ожидалось). Однако, когда я посещаю status страница, браузер предоставляет мне базовое окно аутентификации. Когда я нажимаю "Отмена", мне разрешают нормально загружать страницу. Аналогичным образом, если я уже вошел в систему, меня не будет запрашивать снова на экране состояния, пока не истечет срок моего входа в систему.

Я понимаю, что это можно решить, если не развернуть безопасный контент на /*Но для его перемещения потребовалось бы много работы по изменению жестко запрограммированных путей и тестированию (это очень старое приложение)... и мне осталось сделать еще 5 или 6. Я готов сделать это в случае необходимости, но я хотел выяснить, возможно ли это, не меняя никаких безопасных путей к контенту. У меня есть полная свобода в отношении путей мониторинга сервлетов.

Похоже, это связано с Tomcat 7 - несколько ограничений безопасности не работают, но вместо полного отказа происходит сбой только одной из моих конечных точек, что я нахожу очень странным. Я провел некоторое время в поисках, и похоже, что то, что я делаю, должно работать... но это не так.

я использую web-app версия 3.0, развертывание на Tomcat 7 (пробовали версии 7.0.42 и 7.0.47). Я уже пытался изменить порядок security-constraint блоки.

Мысли?

Вот мой полный web.xml для справки (обратите внимание, что сервлеты мониторинга управляются с помощью аннотаций Java, поэтому их нет):

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
     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">

<display-name>TPS</display-name>

<servlet>
    <servlet-name>CFMLServlet</servlet-name>
    <servlet-class>railo.loader.servlet.CFMLServlet</servlet-class>
    <init-param>
      <param-name>configuration</param-name>
      <param-value>/WEB-INF/railo/</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet>
    <servlet-name>AMFServlet</servlet-name>
    <servlet-class>railo.loader.servlet.AMFServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet>
    <servlet-name>AttachmentServlet</servlet-name>
    <servlet-class>com.package.toolshed.AttachmentServlet</servlet-class>
    <init-param>
        <param-name>configFilePath</param-name>
        <param-value>com/package/toolshed/configuration/tps-config.xml</param-value>
    </init-param>
    <init-param>
        <param-name>configPathParam</param-name>
        <param-value>attachment.servlet.pathPrefix</param-value>
    </init-param>
    <load-on-startup>6</load-on-startup>
</servlet>


<servlet-mapping>
    <servlet-name>CFMLServlet</servlet-name>
    <url-pattern>*.cfm</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>CFMLServlet</servlet-name>
    <url-pattern>*.cfml</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>CFMLServlet</servlet-name>
    <url-pattern>*.cfc</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>AMFServlet</servlet-name>
    <url-pattern>/flashservices/gateway/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>AttachmentServlet</servlet-name>
    <url-pattern>/attachments/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<welcome-file-list>
    <welcome-file>index.cfm</welcome-file>
    <welcome-file>index.cfml</welcome-file>
</welcome-file-list>

<security-constraint>
    <display-name>Security Constraint</display-name>
    <web-resource-collection>
        <web-resource-name>Protected Area</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>CN=A,OU=B,OU=C,OU=D,DC=E,DC=F</role-name>
    </auth-constraint>
</security-constraint>

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Unprotected Pages</web-resource-name>
        <url-pattern>/health/*</url-pattern>
    </web-resource-collection>
</security-constraint>

<login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>TPS</realm-name>
</login-config>

<security-role>
    <role-name>CN=A,OU=B,OU=C,OU=D,DC=E,DC=F</role-name>
</security-role>
</web-app>

1 ответ

Решение

Понял это.

Оказывается, что сервлет состояния загружал документ CSS, и эта загрузка вызывала аутентификацию. Что меня смущает, так это то, что JSP загрузки как состояния, так и версии загружают, и эти JSP не нужно рассматривать в ограничении безопасности (один из шагов, которые я предпринял изначально, заключался в добавлении *.jsp к моим ограничениям безопасности). JSP существуют по тому же пути, что и CSS.

Новый, работающий web.xml

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Unprotected Pages</web-resource-name>
        <url-pattern>/health/*</url-pattern>
        <url-pattern>/monitoringCommon.css</url-pattern>
    </web-resource-collection>
</security-constraint>
Другие вопросы по тегам