Несколько ограничений безопасности в 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>