在symfony2中注销后我无法清除我的会话

时间:2015-11-24 17:39:10

标签: php symfony

当我尝试在symfony2中注销时,我的会话支持被完全清除 但如果我点击浏览器后退按钮,我就可以进入上一次会议

 firewalls:
    main:
        pattern: /.*
        form_login:
            login_path: /login
            check_path: /login_check
            default_target_path: /hrs/applyleave/
        logout: 
            path: /logout
            target: /login
            path: security_admin_logout
            target: security_admin_login
            invalidate_session: true
            delete_cookie:~
        security: true
        anonymous: true

我有什么遗失的吗?

2 个答案:

答案 0 :(得分:5)

我最近遇到了这个小问题,在几个帖子的帮助下,我提出了以下解决方案。

为了澄清这里的问题,在退出安全区域后,我们希望通过单击后退按钮来防止再次查看任何安全的先前页面。为此,不得将这些先前页面存储在客户端缓存中。我们需要拦截每个Symfony页面响应,检查它是否是一个安全页面,如果是,请设置标题以返回no-cache。

第一步,设置一个响应侦听器类:

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, 'http://example.com/Get_Users.php?id=1');
$result = curl_exec($ch);
curl_close($ch);

第2步,将其注册为服务:

$(document).ready(function() {
  $.get({
    url: 'Get_Users.php',
    data: 'id=1',
    success: function(response) {
      // response contains your json encoded data
      // in this case you **must** use echo to transfer the data from `Get_Users.php`
    }
  });
});

第3步,将namespace AppBundle\EventListener; use Symfony\Component\HttpKernel\Event\FilterResponseEvent; class ResponseListener { public function onKernelResponse(FilterResponseEvent $event) { $request = $event->getRequest(); if ($this->disableThisPageCache($request->getPathInfo())) { $headers = $event->getResponse()->headers; $headers->set('Cache-Control', 'no-cache, no-store, must-revalidate'); // HTTP 1.1. $headers->set('Pragma', 'no-cache'); // HTTP 1.0. $headers->set('Expires', '0'); // Proxies. } } private function disableThisPageCache($currentPath) { $paths = array('/admin', '/customer'); foreach ($paths as $path) { if ($this->checkPathBegins($currentPath, $path)) { return true; } } return false; } private function checkPathBegins($path, $string) { return substr($path, 0, strlen($string)) === $string; } } 数组设置为包含应用程序的安全路径。如果您需要找到这些,请查看access_control部分下的security.yml文件。

使用Symfony Security服务可能有更好的方法来检查页面是否在安全区域,但此解决方案适用于我的应用程序。

感谢这些帮助我的帖子:

答案 1 :(得分:0)

您需要将缓存控制指令设置为不从浏览器缓存加载页面:

    $response = new Symfony\Component\HttpFoundation\Response();
    $response->setContent($this->renderView(YOUR_VIEW));
    $response->headers->addCacheControlDirective('no-cache', true);
    $response->headers->addCacheControlDirective('max-age', 0);
    $response->headers->addCacheControlDirective('must-revalidate', true);
    $response->headers->addCacheControlDirective('no-store', true);