symfony - 登录后无法重定向
问题描述
我在 symfony 3.4 中使用 fosuserbundle。我想在登录后重定向问题是登录后无法重定向它始终保持在登录页面中,即使我是alerdy登录在这里你可以找到我的代码(https://gist.github.com/Bakhshi-Faisal/b0eda6075af53130b2e6513059e07802 )
我尝试了下面的代码
public function onAuthenticationSuccess(Request $request, TokenInterface $token)
{
$roles = $token->getRoles();
$rolesTab = array_map(function ($role) {
return $role->getRole();
}, $roles);
if (in_array('ROLE_COMPTABLE', $rolesTab, true)) {
// c'est un aministrateur : on le rediriger vers l'espace admin
$redirection = new RedirectResponse($this->router->generate('comptable'));
} else {
$redirection = new RedirectResponse($this->router->generate('visiteur'));
}
return $redirection;
}
解决方案
停留在同一页面意味着您实际上不会访问您的代码。
您应该在侦听器中处理此问题,而不是在控制器中。
您的类 LoginController 应称为 LoginListener 并位于某个事件文件夹中。
控制器仅用于包含操作。这可能是你的问题。
这是重定向用户的示例,具体取决于他是否已连接时尝试访问的页面:
<?php
namespace AppBundle\EventListener;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use FOS\UserBundle\Model\User;
/**
* Class RedirectUserListener
* @package AppBundle\EventListener
*/
class RedirectUserListener
{
private $tokenStorage;
private $router;
/**
* RedirectUserListener constructor.
* @param TokenStorageInterface $tokenStorage
* @param RouterInterface $router
*/
public function __construct(TokenStorageInterface $tokenStorage, RouterInterface $router)
{
$this->tokenStorage = $tokenStorage;
$this->router = $router;
}
/**
* @param GetResponseEvent $event
*/
public function onKernelRequest(GetResponseEvent $event)
{
if ($this->isUserLogged() && $event->isMasterRequest()) {
/** @var \AppBundle\Entity\User $user */
$user = $this->tokenStorage->getToken()->getUser();
if (empty($user->getModifiedBy())) {
$user->setModifiedBy($user);
}
$currentRoute = $event->getRequest()->attributes->get('_route');
if ($this->isAuthenticatedUserOnAnonymousPage($currentRoute)) {
$response = new RedirectResponse($this->router->generate('app_default_index'));
$event->setResponse($response);
}
}
}
/**
* @return bool
*/
protected function isUserLogged()
{
$token = $this->tokenStorage->getToken();
if (is_null($token)) {
return false;
}
$user = $token->getUser();
return $user instanceof User;
}
/**
* @param $currentRoute
* @return bool
*/
protected function isAuthenticatedUserOnAnonymousPage($currentRoute)
{
return in_array(
$currentRoute,
['fos_user_security_login', 'fos_user_resetting_request',
'app_user_registration']
);
}
}
在 services.yml 中:
app.tokens.action_listener:
class: AppBundle\EventListener\RedirectUserListener
arguments:
- "@security.token_storage"
- "@router"
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
推荐阅读
- c# - 基于列表中的字符串选择 C# LINQ
- rust - 如何将 &i32 转换为 f64?
- scala - Scala Pairs:如何计算值中出现的次数(数字列表)
- android - Flutter - 删除脚手架中的抽屉图标
- jquery - 将 JQuery 变量分配给 Html.Actionlink 以将参数传递给新视图
- python - 如何使用elasticsearch生成词云?
- javascript - 在 Qml 中延迟循环
- javascript - 如何将 Web 组件分离到单个文件并加载它们?
- ios - 如何通过视图设置默认 UITextField 值确实加载
- python - 动态内容中的网页抓取