Java 当页面不存在时,在未经授权的URL上找不到页面404

Java 当页面不存在时,在未经授权的URL上找不到页面404,java,spring,spring-mvc,spring-security,http-status-code-404,Java,Spring,Spring Mvc,Spring Security,Http Status Code 404,我使用默认的deny all设置了Spring安全性(见下面的示例)。我不想更改默认的deny all,因为这是安全配置的防御方式,也是一种良好的做法。显然,若用户想要访问某个不存在的页面,他会得到403,因为默认的拒绝所有策略。当页面不存在时,我想要结果404,当用户访问受限时,我想要结果403。有没有办法为这种行为配置Spring安全性 示例: 当用户请求不存在的东西时,他应该得到404(不是403)。当编辑用户请求/posts/remove时,他应该得到403。我不确定这样的配置是否

我使用默认的deny all设置了Spring安全性(见下面的示例)。我不想更改默认的deny all,因为这是安全配置的防御方式,也是一种良好的做法。显然,若用户想要访问某个不存在的页面,他会得到403,因为默认的拒绝所有策略。当页面不存在时,我想要结果404,当用户访问受限时,我想要结果403。有没有办法为这种行为配置Spring安全性

示例:



当用户请求不存在的东西时,他应该得到404(不是403)。当编辑用户请求
/posts/remove
时,他应该得到403。

我不确定这样的配置是否可行,因为安全过滤器会在Web应用程序的URL映射逻辑有机会确定是否有任何资源可以响应该特定请求之前的早期阶段拦截和处理请求。
如果安全过滤器决定通过匹配请求URL来拒绝访问,那么如果在该URL后面有一个页面,它将永远不会出现


编辑(对Michal评论的回应): 由于URL到资源/处理程序的映射在每个应用程序中都是非常任意的,因此任何框架都不可能提供通常适用于每个Web应用程序的算法,并且可以提前确定映射过程的结果

如果你可以为你的webapp实现这样的逻辑(例如,通过了解它的整个url空间),你可以很容易地创建你建议的过滤器。如果您碰巧使用SpringMVC,调用应用程序中部署的每个
HandlerMapping
,可以帮助实现这样的过滤器


无论如何,我想提供这种功能不可能是一个独立的安全库的范围,它应该能够与各种不同的web框架一起工作。

我认为您所做的一个假设是不正确的。你说:

当用户请求/不存在的东西时,他应该得到404(不是403)

这与:

<intercept-url pattern="/**" access="denyAll" />
经过身份验证的用户应获得
200 OK
响应。未经验证的用户应重定向到登录页面

现在假设此url不存在:

经过身份验证的用户应得到
404notfound
响应。未经验证的用户应重定向到登录页面

如果我们将
404
返回给未经身份验证的用户,我们将暴露一个安全漏洞,攻击者可以通过电子邮件地址查询系统中是否存在用户


因此,您需要重新考虑上述假设或您的
denyAll
规则,因为它们相互排斥。

您是对的。我也这么认为,但在我看来,这不是一种正确的行为。也许应该有一个过滤器(或者它应该是安全过滤器的一部分),在决定安全问题之前确定url映射是否存在。这超出了安全库的范围。我脑子里只有SpringMVC请求映射,所以我忽略了这个观点:)我把我的整个url空间都分开了,所以我很容易(检查url是否存在)。我只是不想重新发明轮子。谢谢。我想你们可能错过了一个微妙的要点。看见
<intercept-url pattern="/**" access="denyAll" />
/admin/accounts/email/miles@example.com
/admin/accounts/email/coltrane@example.com