Php 如何在symfony 4注销中重定向到外部url
只是想知道Symfony 4中是否有一个简单的解决方案。通常,用户会注销并被发送回主页。但是有一个页面会检查用户当前是否在另一个站点上进行了身份验证,如果这不正确,我会有一个链接将用户从我的站点注销并重定向到外部站点。我使用app.php中的以下控制器路由,在基于silex的旧版本的站点上管理了这一点Php 如何在symfony 4注销中重定向到外部url,php,symfony,Php,Symfony,只是想知道Symfony 4中是否有一个简单的解决方案。通常,用户会注销并被发送回主页。但是有一个页面会检查用户当前是否在另一个站点上进行了身份验证,如果这不正确,我会有一个链接将用户从我的站点注销并重定向到外部站点。我使用app.php中的以下控制器路由,在基于silex的旧版本的站点上管理了这一点 $app->get('/logout', $app->factory(function() use($app) { $pid = $app['request_stack']->g
$app->get('/logout', $app->factory(function() use($app) {
$pid = $app['request_stack']->getCurrentRequest()->query->get('pid');
$message = $app['request_stack']->getCurrentRequest()->query->get('message');
$redirect = $app['request_stack']->getCurrentRequest()->query->get('redirect');
return $app->redirect(FRAMEWORK_URL."/logout?pid=$pid&message=$message&redirect=$redirect");
})
))
谢谢
Martyn在
security.yaml
中将防火墙的注销.target
值设置为外部URL:
firewalls:
main:
...
logout:
...
target: 'EXTERNAL URL'
logout.target的值可以是URL或应用程序路由名称。应用程序路由和相关控制器可用于创建动态重定向目标。确定,因此尝试了此方法
我在控制器中创建了一条新路线:
/**
* @Route("/redirectafterlogout/{url?/}", name="redirectafterlogout")
*/
public function redirectafterlogout($url)
{
if($url == "/"){
// redirects to the "homepage" route
return $this->redirectToRoute('homepage');
} else {
return $this->redirect('http://'.$url);
}
}
我把这个添加到security.yaml
logout:
path: logout
target: 'redirectafterlogout'
如果我使用正常的注销链接,它会很好地将我注销,并将我放在主页上。但是,如果我尝试以下链接:
它重定向我,但似乎没有将我注销?我可以使用我的浏览器返回,但我仍然登录
不知道我做错了什么
非常感谢不幸的是注销。由于有特殊检查(在Symfony\Component\Security\Http\HttpUtils::createRedirectResponse
中)将请求域与重定向域相匹配,因此target
将不起作用。如果它们不相同,它会将目标设置为/
重定向到外部URL的正确方法是创建实现Symfony\Component\Security\Http\Logout\LogoutSuccessHandlerInterface
的类,例如:
嗨,安德烈亚斯,你介意再帮我一点忙吗?我似乎无法让它工作(见下文)。如果我链接到带有url的“redirectafterlogout”,则它不会将我注销?target
只能设置为同一个域,因此这将不起作用。查看Symfony\Component\Security\Http\HttpUtils::createRedirectResponse
。有一张支票!preg_match(sprintf($this->domainRegexp,preg_quote($request->getHttpHost()),$host[0])
,它确保要重定向的域和请求的域相同。也许您的浏览器只是显示一个缓存页面(处于登录状态)。重定向后,您是否能够访问任何受限制的路由?