php – 如何销毁Symfony 2中的所有会话
发布时间:2020-12-13 21:58:23 所属栏目:PHP教程 来源:网络整理
导读:更新 在对一些专家进行详细调查和咨询后,我发现破坏会话的想法是不正确的.更好的问题是 – ?如何强制所有用户注销?. 这个问题不应该从会话角度解决,这是一个非常低级别的机制,而是来自安全组件.即使您删除了所有会话数据,也会通过记住下一个用户请求的cookie
更新
在对一些专家进行详细调查和咨询后,我发现破坏会话的想法是不正确的.更好的问题是 – ?如何强制所有用户注销?. 这个问题不应该从会话角度解决,这是一个非常低级别的机制,而是来自安全组件.即使您删除了所有会话数据,也会通过记住下一个用户请求的cookie来重新创建它. 我将在稍后尝试提出有效的解决方案. 这个问题 我需要实现所谓的应用程序?lockdown?的功能,所以我需要一种方法来记录Symfony 2应用程序中的所有用户(关闭所有活动会话). 实现此功能的最佳方法是什么? 理想情况下,该解决方案应与所有可能的save-handlers完全兼容. 看起来SessionHandlerInterface没有提供这样做的方法. 解决方法
编程方法应该是使用会话侦听器,并在特定事件存在时使会话无效,例如数据库表中存在标志/时间戳或某些类似事件.
如本文所述 Invalidate the Session Based on its Age use SymfonyComponentHttpKernelEventGetResponseEvent; use SymfonyComponentHttpKernelHttpKernelInterface; class SessionListener { /** * @var AcmeDemoBundleServiceSessionInvalidator */ protected $sessionInvalidator; function __construct($sessionInvalidator) { $this->sessionInvalidator=$sessionInvalidator; } public function onKernelRequest(GetResponseEvent $event) { if ($event->getRequestType() !== HttpKernelInterface::MASTER_REQUEST) { return; } $session = $event->getRequest()->getSession(); $metadataBag = $session->getMetadataBag(); $lastUsed = $metadataBag->getLastUsed(); if ($lastUsed === null) { // the session was created just now return; } // "last used" is a Unix timestamp if (! $this->sessionInvalidator->checkTimestampIsValid($lastUsed)) $session->invalidate(); } } 和配置: <service id="amce_security.verify_session_listener" class="AcmeDemoBundleEventListenerSessionListener"> <argument type="service" id="acme.session_invalidator"/> <tag name="kernel.event_listener" event="kernel.request" priority="100" method="onKernelRequest" /> </service> 希望这有帮助 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |