[英]Redirect Symfony2 LogoutSuccessHandler to original logout target
我需要在注銷時修改我的用戶對象。 為此,我有一個security.yml,其中包含以下內容(除其他外) -
#...
logout:
success_handler: my.logout_success_handler
target: /
#...
...這定義了一個注銷成功處理程序,它在services.yml中定義,如下所示 -
my.security.logout_success_handler:
class: My\Security\LogoutSuccessHandler
arguments: ["@security.context", "@doctrine.orm.default_entity_manager"]
...最后,我的處理程序的業務端是這樣的 -
// ...
public function onLogoutSuccess(Request $request)
{
$user = $this->securityContext->getToken()->getUser();
// ... do stuff with the user object....
$this->em->flush();
// now what?
}
// ...
那么,它說“現在是什么?” 我知道我需要返回一個Response對象。 理想情況下,我希望該響應對象將用戶重定向到security.yml中logout.target中定義的任何內容。
有一種簡單的方法可以查詢嗎? 或者,更好的是,還有另一種做這種事情的方法,它不需要我參與請求/響應對象嗎?
謝謝
您可以將目標定義為parameters.yml
或config.yml
中的parameters.yml
:
parameters:
logout.target: /
然后在security.yml
引用此值:
logout:
success_handler: my.logout_success_handler
target: %logout.target%
和/或將其注入您的注銷處理程序:
my.security.logout_success_handler:
class: My\Security\LogoutSuccessHandler
arguments: ["@security.context", "@doctrine.orm.default_entity_manager", %logout.target%]
並返回具有此值的RedirectResponse
:
// Assign the 3. constructor parameter to the instance variable $logoutTarget
public function onLogoutSuccess(Request $request)
{
// ...
return new RedirectResponse($this->logoutTarget);
}
所以,我想我已經找到了正確的答案 -
我的security.yml現在看起來像這樣,而不是實現LogoutSuccessHandlerInterface
並配置logout.success_handler
。
# ...
logout:
handlers: [my.bundle.security.logout_handler]
# ...
...我正在實現Symfony\\Component\\Security\\Http\\Logout\\LogoutHandlerInterface
。 令人困惑的命名,但這似乎是進行后退出操作的首選方式,而無需涉及響應對象。 我的實現看起來像這樣 -
namespace My\Bundle\Security;
use Symfony\Component\Security\Http\Logout\LogoutHandlerInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\ORM\EntityManager;
/**
* Do post logout stuff
*/
class LogoutHandler implements LogoutHandlerInterface
{
/**
* @var EntityManager
*/
protected $em;
/**
* Constructor
* @param EntityManager $em
*/
public function __construct(EntityManager $em)
{
$this->em = $em;
}
/**
* Do post logout stuff
*/
public function logout(Request $request, Response $response, TokenInterface $authToken)
{
$user = $authToken->getUser();
// do stuff with the user object...
$this->em->flush();
return $response;
}
}
...正如你所看到的, LogoutHandlerInterface
提供了一個預制的$response
對象,我可以在完成后返回它。
您可以使用合成並將默認的LogoutSuccessHandler
注入對象並在其上調用onLogoutSucces
方法。
以下pseudu代碼顯示了這樣做的想法。
class MyLogoutSuccessHandler implements \LogoutSuccessHandler
{
protected $original;
public function __construct(OriginalLogoutSuccesHandler $original)
{
$this->original = $original;
}
public function onLogoutSuccess(Request $request)
{
// do stuf your want and delegate to the original
return $this->original->onLogoutSuccess($request);
}
}
這也是HttpKernelInterface
在HttpKernelInterface
工作的方式以及在應用程序中使用HttpCache
的方式。
希望這有幫助,快樂編碼:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.