Symfony2在显示404错误页面时使用is_granted('IS_AUTHENTICATED_FULLY'),导致ResourceNotFoundException。

19

我已经设置了自定义错误页面,用于显示特定的HTTP错误,存放在以下文件夹中:

app/Resources/TwigBundle/views/Exception/

403页面(error403.html.twig)正常显示。

500页面(error500.html.twig)正常显示。

404页面(error404.html.twig)会抛出500服务器错误:

PHP致命错误:未捕获异常'Symfony\Component\Routing\Exception\ResourceNotFoundException'

这个错误是通过进行身份验证检查来显示特定菜单项的用户(已经认证或未认证)引起的。

{% if is_granted('IS_AUTHENTICATED_FULLY') %}

如果我取消检查并允许所有菜单项显示,页面会按预期加载错误页面。同样,403页面将按预期显示,并且可以毫无问题地利用身份验证检查。

我卡在这个问题上了。这些页面完全相同,除了文件名之外。


你正在使用哪个版本的Symfony? - j0k
最新且最棒的。我相信是 2.1-dev。 - Nick
2
我认为最好(因为-dev版本)在GitHub上创建一个问题,Symfony的人在那里真的很乐意帮助 :) - dmirkitanov
已添加到GitHub:https://github.com/symfony/symfony/issues/5225 - Nick
3个回答

15

12

自2.1版本以来,您不能在404页面中使用is_granted功能:

这在升级文件中已经提到了。

防火墙侦听器现在在路由侦听器之后注册。这意味着特定的防火墙URL(如/login_check和/logout)现在必须在您的路由配置中定义正确的路由。此外,如果您有一个自定义的404错误页面,请确保不要在其上使用任何安全相关的功能,例如is_granted

请参见: https://github.com/symfony/symfony/blob/master/UPGRADE-2.1.md#security


是的,他们在收到 GitHub 上多个问题帖子后将其添加到文档中... 我仍然不太喜欢这种处理方式。 - Nick
Symfony 2.8捕获异常,而不是返回错误信息(https://github.com/symfony/symfony/pull/15953)。因此不再出现错误,但这可能并不完全是您想要的行为。 - gapple

2
我建议检查app.security.token,使其更加严格并且在用户匿名时也能够评估为true
如果您检查app.user,则在异常模板中会评估为false,但即使防火墙存在(=常规模板),但用户未登录。这将防止例如显示登录按钮。
参见:https://github.com/symfony/symfony-docs/pull/2359

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