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
人将这些操作委托给几个注销处理程序:CookieClearingLogoutHandler
和SessionLogoutHandler
.我认为最好的做法是调用那些处理程序而不是自己实现这种低级逻辑.但是,我找不到办法做到这一点.
此解决方案适用于Symfony 2.6.区别在于security.token_storage
.
parameters.yml
:# parameters.yml
parameters:
session.name: SESS
session.remember_me.name: LONGSESS
Run Code Online (Sandbox Code Playgroud)
config.yml
的使用会话名称的第一个参数:# config.yml
framework:
session:
name: "%session.name%"
Run Code Online (Sandbox Code Playgroud)
security.yml
使用第二个参数记住我的会话名称:# security.yml
security:
firewalls:
demo_secured_area:
remember_me:
name: "%session.remember_me.name%"
Run Code Online (Sandbox Code Playgroud)
如果需要,可以在内核事件侦听器中使用此类代码.
// 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应用程序.
我希望它有所帮助.
您可能必须显式调用会话存储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)