在登录表单Symfony 3.4解析为在自定义侦听器中liip_imagine路由之前重定向到页面



登录Symfony后,我在获得重定向时遇到问题。

它适用于某些页面,但对于其他页面,last_route会话变量设置为使用以下liip_imagine_filter的用户个人资料图片:

"last_route" => [
"name" => "liip_imagine_filter",
"params" => [
"filter" => "profile_picture"
"path" => "frederick-jacobson/5ba60fc93056b.png"
]
]

登录表单身份验证器:

class LoginFormAuthenticator extends AbstractFormLoginAuthenticator
{
/*...*/
protected function getDefaultSuccessRedirectURL()
{
/** @var Session $session */
$session = $this->container->get('session');
$priorPage = $session->get('last_route');
return $this->router->generate($priorPage['name'], $priorPage['params']);
//        return $this->router->generate('poll_index');
}
}

这意味着它会尝试重定向到图像 URL。

服务.yml:

poll.last_route_event_listener:
class: PollBundleServicesLastRouteListener
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 30 }

LastRouteListener:

use SymfonyComponentHttpKernelEventGetResponseEvent;
use SymfonyComponentHttpKernelHttpKernel;
class LastRouteListener
{
public function onKernelRequest(GetResponseEvent $event)
{
// Do not save subrequests
if ($event->getRequestType() !== HttpKernel::MASTER_REQUEST) {
return;
}
$request = $event->getRequest();
$session = $request->getSession();
$routeName = $request->get('_route');
$routeParams = $request->get('_route_params');
if ($routeName[0] == '_') {
return;
}
$routeData = ['name' => $routeName, 'params' => $routeParams];
// Do not save same matched route twice
$thisRoute = $session->get('this_route', []);
if ($thisRoute == $routeData) {
return;
}
$session->set('last_route', $thisRoute);
$session->set('this_route', $routeData);
}
}

有人可以帮我找出我做错了什么和/或告诉我在登录之前处理重定向到页面的正确方法吗?

正如我问题下面的评论中指出的那样。我正在使用一个自定义侦听器,该侦听器正在拾取liip_imagine_filter路由并将其设置为last_route会话变量。

我可以向侦听器添加一个签入,如下所示:

if ($routeName[0] == '_' || $routeName == 'liip_imagine_filter') {
return;
}

但是更好的处理方法是使用内置SymfonyComponentSecurityHttpUtilTargetPathTrait

它通常在用户点击受限页面时自动设置,但可以使用$this->saveTargetPath($request->getSession(), $providerKey, $request->getUri());手动设置

然后,您可以使用$targetPath查找要重定向到的路由LoginFormAuthenticator

use SymfonyComponentSecurityHttpUtilTargetPathTrait;

class LoginFormAuthenticator extends AbstractFormLoginAuthenticator
{
/*...*/
use TargetPathTrait;
public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)
{
$targetPath = $this->getTargetPath($request->getSession(), $providerKey);
if (!$targetPath || $request->getBaseUrl() && !strpos($targetPath, $request->getBaseUrl())) {
$targetPath = $this->container->get('router')
->generate('poll_index');
}
return new RedirectResponse($targetPath);
}
}

最新更新