【问题标题】:symfony2 logoutsymfony2 注销
【发布时间】:2012-09-26 10:19:54
【问题描述】:

我的问题是捕获用户注销。我拥有的代码是:

public  function onAuthenticationFailure(Request $request, AuthenticationException $exception){

    return new Response($this->translator->trans($exception->getMessage()));
}

public function logout(Request $request, Response $response, TokenInterface $token)
{
    $empleado = $token->getUser();
    $log = new Log();
    $log->setFechalog(new \DateTime('now'));
    $log->setTipo("Out");
    $log->setEntidad("");
    $log->setEmpleado($empleado);
    $this->em->persist($log);
    $this->em->flush();
}

public function onLogoutSuccess(Request $request) {
    return new RedirectResponse($this->router->generate('login'));
}

问题是我在运行注销功能时无法访问用户令牌TokenInterface

【问题讨论】:

  • 解决问题是服务安全上下文谢谢。
  • $token->getUser() 是否返回空值?还是 $token 为空?

标签: php symfony login


【解决方案1】:

要获取令牌,您必须注入安全上下文。

1.创建类 Logout 侦听器,如下所示:

namespace Yourproject\Yourbundle\Services;
...
use Symfony\Component\Security\Http\Logout\LogoutSuccessHandlerInterface;
use Symfony\Component\Security\Core\SecurityContext;

class LogoutListener implements LogoutSuccessHandlerInterface {

  private $security;  

  public function __construct(SecurityContext $security) {
    $this->security = $security;
  }

  public function onLogoutSuccess(Request $request) {
     $user = $this->security->getToken()->getUser();

     //add code to handle $user here
     //...

     $response =  RedirectResponse($this->router->generate('login'));

    return $response;
  }
}

2。然后在 service.yml 中,添加这一行:

....
logout_listener:
   class:  Yourproject\Yourbundle\Services\LogoutListener
   arguments:  [@security.context]

就是这样,希望对你有帮助。

【讨论】:

  • 这不起作用,对于 logout_listener 服务,您没有定义的事件。所以听者根本不会被解雇。
  • @artworkadshi,我已经在 service.yml 上注册了这个事件,所以当用户注销时它会被触发。我在几个项目交响乐上都用过这个,没有问题。
  • 在我看来,有必要在 2014 年 7 月 24 日 15:22 的答案中添加 ALSO 行。它在 symfony 2.5 中对我有用。
  • 在 Symfony 3 中你必须使用 ['@security.authorization_checker'] 而不是 security.context
【解决方案2】:

http://symfony.com/doc/current/reference/configuration/security.html

security.yml

secured_area:

    logout:
        path:   /logout
        **success_handler: logout_listener** 

【讨论】:

    【解决方案3】:

    看看这里是否可以覆盖捆绑包的任何控制器:

    http://symfony.com/doc/current/cookbook/bundles/inheritance.html

    【讨论】:

      猜你喜欢
      • 2012-02-01
      • 2012-09-17
      • 1970-01-01
      • 2015-05-27
      • 1970-01-01
      • 1970-01-01
      • 2013-12-04
      • 2015-10-05
      • 2012-08-18
      相关资源
      最近更新 更多