当我尝试在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
我有什么遗失的吗?
答案 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);