只是想知道Symfony 4中是否对此有一个简单的解决方案。通常,用户会注销并被发送回首页。但是有一个页面会检查用户当前是否在另一个站点上进行了身份验证,如果这是不正确的,我有一个链接可以将用户从我的站点注销并重定向到外部站点。我使用以下app.php中的控制器路由在旧的基于silex的网站上进行了管理
$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
答案 0 :(得分:2)
为logout.target
中的防火墙将security.yaml
的值设置为外部URL:
firewalls:
main:
...
logout:
...
target: 'EXTERNAL URL'
值logout.target
可以是URL或应用程序路由名称。应用程序路由和相关控制器可用于创建动态重定向目标。
答案 1 :(得分:1)
很遗憾,logout.target
无法正常工作,因为(在Symfony\Component\Security\Http\HttpUtils::createRedirectResponse
中有特殊的检查将请求域与重定向域进行匹配。如果它们不同,则将目标设置为/
。
重定向到外部URL的正确方法是创建实现Symfony\Component\Security\Http\Logout\LogoutSuccessHandlerInterface
的类,例如:
<?php
// src/Security/CustomLogoutSuccessHandler.php
class CustomLogoutSuccessHandler implements LogoutSuccessHandlerInterface
{
private $target;
public function __construct(string $target)
{
$this->target = $target;
}
public function onLogoutSuccess(Request $request)
{
return new RedirectResponse($this->target);
}
}
然后在services.yaml
中创建服务:
services:
App\Security\CustomLogoutSuccessHandler:
arguments: ['%env(resolve:LOGOUT_TARGET_URL)%'] # resolve from .env (or you can get from anywhere)
最后告诉security.yaml
使用您的处理程序,而不是默认的处理程序:
security:
firewalls:
main:
logout:
success_handler: 'App\Security\CustomLogoutSuccessHandler'
答案 2 :(得分:0)
好吧,尝试这个
我在控制器中创建了一条新路线:
/**
* @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'
它可以正常工作,并且注销我,如果我使用普通的注销链接,请把我放在首页上。但是,如果我尝试链接:
它重定向了我,但似乎没有注销我?我可以使用浏览器返回,但我仍可以登录吗?
不确定我在做什么错吗?
谢谢