我对 Spring Security 进行了以下设置,默认拒绝所有(请参见下面的示例)。我不想更改默认拒绝所有,因为它是安全配置的防御方式,并且也被认为是良好的做法。显然,如果用户想要访问某个不存在的页面,他会得到 403,因为默认拒绝所有策略。当页面不存在时,我想要结果 404;当用户访问权限受到限制时,我想要结果 403。有没有办法为这种行为配置 Spring Security?
示例:
<intercept-url pattern="/posts/remove" access="hasRole('ADMIN')" />
<intercept-url pattern="/posts/add" access="hasRole('EDITOR')" />
<intercept-url pattern="/posts" access="permitAll" />
<intercept-url pattern="/" access="permitAll" />
<!-- Default is access denied -->
<intercept-url pattern="/**" access="denyAll" />
</http>
当用户请求 /something-that-not-exists
时,他应该得到 404(而不是 403)。当 EDITOR 用户请求 /posts/remove
时,他应该得到 403。
最佳答案
我认为您所做的假设之一是不正确的。你说:
When user requests /something-that-not-exists he should get 404 (Not 403)
这与以下内容直接冲突:
<intercept-url pattern="/**" access="denyAll" />
因为/something-that-not-exists
是 protected 资源无论它是否存在。作为未经身份验证的用户,您不应该提出“/something-that-not-exists
是否包含有效资源?”的问题。这样做违反了安全模型。想象一下这些假设的网址:
假设这个网址存在:
/admin/accounts/email/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="771a1e1b120437120f161a071b125914181a" rel="noreferrer noopener nofollow">[email protected]</a>
经过身份验证的用户应收到 200 OK
响应。未经身份验证的用户应被重定向到登录页面。
假设现在这个网址不存在:
/admin/accounts/email/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="63000c0f1711020d0623061b020e130f064d000c0e" rel="noreferrer noopener nofollow">[email protected]</a>
经过身份验证的用户应该收到 404 NOT FOUND
响应。未经身份验证的用户应被重定向到登录页面。
如果我们向未经身份验证的用户返回 404
,我们就会暴露一个安全漏洞,攻击者可以通过电子邮件地址查询系统中是否存在用户。
因此,您需要重新考虑上述假设或 denyAll
规则,因为它们是互斥的。
关于java - 当页面不存在时,未在未经授权的 URL 上找到页面 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16379186/