Подтвердить что ты не робот

Как исключить один 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. Возможно ли это?

4b9b3361

Ответ 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