Как исключить один URL из авторизации
Мой web.xml выглядит так:
<security-constraint>
<web-resource-collection>
<web-resource-name>app</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>Role</role-name>
</auth-constraint>
</security-constraint>
это защищает каждую сторону от авторизации, но я хочу исключить /info. Возможно ли это?
Ответы
Ответ 1
Опустите элемент <auth-constraint>
в <security-constraint>
для ресурсов, для которых вам не нужна аутентификация, например:
<security-constraint>
<web-resource-collection>
<web-resource-name>app</web-resource-name>
<url-pattern>/info</url-pattern>
</web-resource-collection>
<!-- OMIT auth-constraint -->
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>app</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>Role</role-name>
</auth-constraint>
</security-constraint>
Ответ 2
Решением является использование альтернативной инфраструктуры безопасности, например Apache Shiro вместо безопасности на основе контейнера. Тогда легко исключить ресурс из защищенного контента. Используя Сиро, вы добавите WEB-INF/shiro.ini
:
[urls]
/info = anon
/** = authc
Ответ 3
Я не знаю, правильно ли я прав! Имея мои ограниченные знания, я думаю, что для обеспечения безопасности защищаемый контент объявляется с использованием одного или нескольких элементов коллекции веб-ресурсов. Каждый элемент коллекции веб-ресурсов содержит необязательную серию элементов шаблона url, за которыми следует необязательная серия элементов http-метода. Значение элемента url-pattern указывает шаблон URL, по которому URL-адрес запроса должен соответствовать запросу, чтобы соответствовать попытке доступа к защищенному контенту. Значение элемента http-метода указывает тип HTTP-запроса, разрешающего.
<security-constraint>
<web-resource-collection>
<web-resource-name>Secure Content</web-resource-name>
<url-pattern>/restricted/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>AuthorizedUser</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
<!-- ... -->
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>The Restricted Zone</realm-name>
</login-config>
<!-- ... -->
<security-role>
<description>The role required to access restricted content </description>
<role-name>AuthorizedUser</role-name>
</security-role>
URL, лежащий под веб-приложением/ограниченным путем, требует роль AuthorizedUser.
Ответ 4
Я пробовал описанный выше путь @user517491, но мой tomcat 7 фильтрует весь трафик в/с https, но предыдущее исключение игнорируется...
<security-constraint>
<web-resource-collection>
<web-resource-name>app1</web-resource-name>
<url-pattern>/webservice/*</url-pattern>
</web-resource-collection>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>Protected Context</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
Как я могу добавить исключение для перехода с http и всем другим трафиком с помощью https???
Ответ 5
Если вы ищете загрузочное решение Spring, попробуйте вот так в файле свойств вашего приложения:
keycloak.security-constraints[0].authRoles[0]=users
keycloak.security-constraints[0].security-collections[0].patterns[0]=/*
keycloak.security-constraints[1].security-collections[0].patterns[0]=/info
Это будет применять безопасность для всех URL-адресов, кроме /info