我在我的主页中嵌入了FosUserBundle登录,我已经覆盖了fos的安全控制器并更改了renderLogin()操作,我必须使用if
条件重定向到上次访问的页面使用< strong> referers , 一切都很好,但我现在意识到HTTP协议不需要HTTP Referer标头,它可以被浏览器设置完全跳过甚至欺骗等不可靠!
但是如果symfony框架可以保证 $request->server->get('HTTP_REFERER')
或$request->headers->get('referer')
将被设置。我可以毫不费力地使用这些
我的问题
$request->server->get('HTTP_REFERER')
和$request->headers->get('referer')
之间的区别是什么?(P.S)
在symfony docs
中如果用户请求http://www.example.com/admin/post/18/edit,则在他们成功登录后,最终会将其发送回http://www.example.com/admin/post/18/edit。这是通过在会话中存储请求的URL来完成的。
但他们没有解释它的内在工作。如果 referers 最终被证明是不可靠的,那么我的选择如下,欢迎任何建议
1)。注册列表器并添加属性last_path
2)。存储会话变量last_path
答案 0 :(得分:2)
您可以在登录会话之前保存所请求的URL,然后如果成功将用户重定向到所需的URL。
捕获URL并将其保存在会话启动方法中,然后在onAuthenticationSuccess方法中恢复。
obs。:下面将仅显示理解解决方案所需的部分代码,可以在以下位置访问整个代码:http://symfony.com/doc/current/security/guard_authentication.html
<?php
namespace VER\VerCoreBundle\Security;
class FormAuthenticator extends AbstractGuardAuthenticator
{
/**
* {@inheritdoc}
*/
public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)
{
$url = $this->router->generate('_welcome');
$previous = $request->getSession()->get('previous');
if ($previous) {
$url = $previous;
}
return new RedirectResponse($url);
}
/**
* {@inheritdoc}
*/
public function start(Request $request, AuthenticationException $authException = null)
{
$request->getSession()->set('previous', $request->getUri());
$url = $this->router->generate('ver_core_login');
return new RedirectResponse($url);
}
}
?>