9

私の問題は、キャプチャユーザーのログアウトです。私が持っているコードは次のとおりです。

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問題は、ログアウト機能を実行しているときにユーザートークンにアクセスできないことです。

4

3 に答える 3

14

トークンを取得するには、セキュリティ コンテキストを挿入する必要があります。

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]

それだけです、お役に立てますように。

于 2012-11-09T05:24:23.643 に答える
8

http://symfony.com/doc/current/reference/configuration/security.htmlを参照してください

security.yml

secured_area:

    logout:
        path:   /logout
        **success_handler: logout_listener** 
于 2014-07-24T15:22:04.753 に答える