启用"记住我"时,在Symfony 2应用程序中注销用户

Sla*_* II 8 php security authentication logout symfony

我正在寻找一种方法来记录用户退出Symfony 2应用程序,但无法找到正确的方法.

我试过这里描述的方法: Symfony2:如何在控制器中手动记录用户?

$this->get('security.context')->setToken(null);
$this->get('request')->getSession()->invalidate();
Run Code Online (Sandbox Code Playgroud)

当" 记住我 "被禁用时它工作正常,但是,当我启用它时,它不起作用.看起来这个cookie会再次自动重新验证用户.

remember_me:
    key:      "%secret%"
    lifetime: 31536000
    path:     /
    domain:   ~
    always_remember_me: true
Run Code Online (Sandbox Code Playgroud)

将用户退出Symfony 2应用程序的正确方法是什么?我是否需要从服务器端另外删除此cookie?

Sla*_* II 11

感谢@nifr,我能够解决这个问题.以下是手动将用户退出Symfony 2应用程序的防弹分步指南.

警告

Symfony已经实现了将用户注销和删除cookie的功能.有一个LogoutListener人将这些操作委托给几个注销处理程序:CookieClearingLogoutHandlerSessionLogoutHandler.我认为最好的做法是调用那些处理程序而不是自己实现这种低级逻辑.但是,我找不到办法做到这一点.

此解决方案适用于Symfony 2.6.区别在于security.token_storage.

  1. 添加两个附加参数来存储«session»和«remember me»的cookie名称到你的parameters.yml:
# parameters.yml

parameters:
    session.name: SESS
    session.remember_me.name: LONGSESS
Run Code Online (Sandbox Code Playgroud)
  1. 更新您config.yml的使用会话名称的第一个参数:
# config.yml

framework:
    session:
        name: "%session.name%"
Run Code Online (Sandbox Code Playgroud)
  1. 更新您security.yml使用第二个参数记住我的会话名称:
# security.yml

security:
    firewalls:
        demo_secured_area:
            remember_me:
                name: "%session.remember_me.name%"
Run Code Online (Sandbox Code Playgroud)
  1. 这是您可以用来记录当前用户的代码:

如果需要,可以在内核事件侦听器中使用此类代码.

// SomeController.php

/**
 * @Route("/terminate", name="app.terminate")
 */
public function terminateAction()
{
    // Logging user out.
    $this->get('security.token_storage')->setToken(null);

    // Invalidating the session.
    $session = $this->get('request')->getSession();
    $session->invalidate();

    // Redirecting user to login page in the end.
    $response = $this->redirectToRoute('app.login');

    // Clearing the cookies.
    $cookieNames = [
        $this->container->getParameter('session.name'),
        $this->container->getParameter('session.remember_me.name'),
    ];
    foreach ($cookieNames as $cookieName) {
        $response->headers->clearCookie($cookieName);
    }

    return $response;
}
Run Code Online (Sandbox Code Playgroud)

这是内核事件监听器的实现,它将强制用户基于实体属性注销:使用内核事件监听器将用户登出Symfony 2应用程序.

我希望它有所帮助.


Nic*_*ich 5

您可能必须显式调用会话存储save()( Documentation ) 方法。

强制保存和关闭会话。

此外,您可以通过响应标头请求删除会话- 和/或remember_me -cookies。

会议-cookie的名字被配置为容器,参数framework.session.name,默认为session.name从你的价值的php.ini

$cookieName = $this->container->getParameter('framework.session.name');
$response->headers->clearCookie( $cookieName );
Run Code Online (Sandbox Code Playgroud)

remember_me -cookie的名字可以在你的配置security的配置。

security:
    firewalls:
        your_firewall:
            remember_me: 
                name: neverforget # <- cookie-name
Run Code Online (Sandbox Code Playgroud)