簡體   English   中英

將Symfony2 LogoutSuccessHandler重定向到原始注銷目標

[英]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.ymlconfig.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);
    }
}

這也是HttpKernelInterfaceHttpKernelInterface工作的方式以及在應用程序中使用HttpCache的方式。

希望這有幫助,快樂編碼:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM