如何从授权中排除一个URL

64

我的 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。这可能吗?
4个回答

112
在不需要进行身份验证的资源中,可以省略<security-constraint>元素中的<auth-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
我尝试了这种方法,但没有成功。这个方法有效吗? - cherry
9
<url-pattern>/path</url-pattern> 对我来说不起作用,而<url-pattern>/path/</url-pattern>适用于放置在 /path 下的所有文件。此外,<url-pattern>/path/myfile.xhtml</url-pattern> 适用于单个文件,但是 <url-pattern>/path/.xhtml</url-pattern> 不起作用。 - Jonathan L
我尝试过并且运行良好,但要注意容器特定的授权:在我的情况下,Wildfly保护所有资源,因此您也必须记住这一点。 - Vokail

7
如果您正在寻找使用Spring Boot解决方案的Keycloak,请在应用程序属性文件中尝试以下内容:
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

1

我不知道是否理解正确!以我的有限知识,我认为为了实现安全性,需要使用一个或多个web-resource-collection元素声明要保护的内容。每个web-resource-collection元素包含一系列可选的url-pattern元素,后跟一系列可选的http-method元素。url-pattern元素值指定请求URL必须匹配的URL模式,以便请求对应于尝试访问受保护内容的尝试。http-method元素值指定允许的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>

位于Web应用程序/受限路径下的URL需要授权用户角色。

-2
一个解决方案是使用替代的安全框架,例如Apache Shiro,而不是基于容器的安全性。然后很容易从受保护的内容中排除资源。使用Shiro,您可以将其放置在WEB-INF/shiro.ini中:
[urls]
/info = anon
/**   = authc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接