无法在404页面上使用安全组件?

时间:2014-06-25 15:38:07

标签: symfony

我希望我的custom error pages能够使用我的主应用程序基础模板。通过基本模板使用KnpMenu来构建菜单。部分meny仅为特权用户呈现,并且这样做我注入安全组件并执行如下检查:

if ($security->isGranted('ROLE_COURSES')) {

但是,当有404时,在防火墙组件运行之前执行的路由组件中会抛出异常。

由于安全组件尚未运行,我不完全确定实际注入菜单构建器的内容,但无论如何,当我尝试转到不存在的页面时,我会收到另一个异常在生产时执行if语句。

这里推荐的方法是什么?如果我不得不放弃渲染404的菜单,我想这没关系,但我希望我仍然能够以完整的形式呈现菜单。

2 个答案:

答案 0 :(得分:5)

我知道这是一个老问题,但我自己面对这个问题,我通过创建一个匹配所有内容的额外路线来修复它,并且是我的路线最后匹配的东西:

pageNotFound:
    pattern:  /{path}
    defaults: { _controller: MyContentBundle:PageNotFound:pageNotFound, path: '' }
    requirements:
        path: .*

行动很简单:

public function pageNotFoundAction()
{
    throw new NotFoundHttpException();
}

由于您从控制器中抛出NotFound异常,因此防火墙已经运行,您现在在自定义404错误页面中有app.user

答案 1 :(得分:1)

互联网周围有很多这样的情况,它与在安全上下文之前加载的路由有关,因此当找不到路由时甚至没有创建用户。

在您的模板中使用它的方法是使用https://github.com/symfony/symfony-docs/issues/2078中所述的{% if app.user is not null and is_granted() %}

我认为可以翻译成

if (null !== $securityContext->getToken() && $securityContext->isGranted())

但我没有尝试过,所以我不确定。