Symfony2 HttpKernel控制器中的方法之前和之后(Kohana Style)

时间:2013-02-12 11:28:11

标签: php symfony annotations listener symfony-2.1

我知道这个问题已经讨论了很多次,但我找到了一些解决方案,我不确定它是否是最好和最有效的方法。

我的问题:我正在使用fosuserbundle来处理用户身份验证,我还想阻止为登录用户显示登录,密码重置等表单。下面我提出了一些方法:

  1. 第一个(已经实现过)基于内核事件,有一个代码 https://gist.github.com/walmen/871c13014b80c6a3d05d
  2. 我的同事基于方法重载提到的第二种方法(删除每个方法中的侦听器和重复代码,这些方法具有一些不应为登录用户显示的逻辑)
  3. 编写自定义注释,即@RequireAnonymous
  4. 正如我之前提到的,我已经实现了第一种方法,但我不确定它是否是最好和最有效的解决方案(每个请求都会调用此监听器 - 对于应用程序来说,它不是太重负载?听众如何影响应用程序,如果他们?)。

    第二种方法当然是最简单的方法,但是...代码重复听起来不太好。

    最后一个可能是最好的但是如果我们看看这个例子https://gist.github.com/cystbear/1391850,我们会看到在任何控制器调用期间调用事件也有问题。

    任何有好的论据和解释的建议或其他想法?

2 个答案:

答案 0 :(得分:0)

如果我理解正确,您可以使用Symfony Standard附带的JMSSecurityExtraBundle第三种方法。

在您想要从经过身份验证的用户中排除的操作中,您可以这样做:

/**
 * @Secure(roles="IS_AUTHENTICATED_ANONYMOUSLY")
 */
public function fooAction()
{
    // stuff...
}

这可确保请求特定路径的用户未经过身份验证。

答案 1 :(得分:0)

@Ramon并不是因为每个用户都具有IS_AUTHENTICATED_ANONYMOUSLY角色,即使是经过身份验证的角色也是如此。

我们不想抛出像“拒绝访问”之类的异常,但我们希望通过重定向“隐藏”这些页面。

您如何看待这个https://github.com/FriendsOfSymfony/FOSUserBundle/issues/996#issuecomment-14812806