如何在Symfony 4注销中重定向到外部URL

时间:2019-02-05 08:06:11

标签: php symfony

只是想知道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

3 个答案:

答案 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'

它可以正常工作,并且注销我,如果我使用普通的注销链接,请把我放在首页上。但是,如果我尝试链接:

它重定向了我,但似乎没有注销我?我可以使用浏览器返回,但我仍可以登录吗?

不确定我在做什么错吗?

谢谢