我希望在单个 Web 应用程序中,部分部分使用身份验证,部分部分完全开放(或者更具体地说,不使用基于容器的身份验证)。
使用基于容器的身份验证的应用程序部分位于 URL /
而打开的部分位于 URL /openpages
。 (是的,我知道如果反过来的话可能会更容易,但不想开放应用程序的源代码)
这是我对 web.xml 的尝试:
<web-app>
....
<security-constraint>
<web-resource-collection>
<web-resource-name>closedpages</web-resource-name>
<url-pattern>/</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>*</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
</web-app>
因为我的url-pattern声明 /
而不是/*
我想它应该有效。但事实并非如此。无论我访问http://myhost/
或http://myhost/openpages/
我收到 HTTP 身份验证提示。仅http://myhost/
应触发 HTTP 身份验证提示。
我的理解是,<security-constraint>
中未具体涵盖的所有内容是开放的,对吗?所以,/openpages/
不应使用任何身份验证。
更多的是:我真的不喜欢 <login-config>
是在 web 应用程序级别指定的,而不是在每个安全约束级别指定的。这肯定会削弱灵 active 吗?
最佳答案
默认情况下,安全约束
未明确涵盖的所有内容均不打开,请使用whitelisting为此(简而言之:任何没有登录的人都可以使用没有 auth-constraint
的 security-constraint
)。
另请注意,url-pattern
值并不完全直观,请参阅 this answer 中的详细信息。以及 this question 中的多个 url 模式匹配问题的示例(其中 /testresource.xml
匹配 /*
和 *.xml
)。
关于java - web.xml 并混合 no-auth 和 auth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36073655/