登录后无法重定向
Can't do redirect after login
我在 symfony 3.4 中使用 fosuserbundle。
我想在登录后重定向问题是登录后无法重定向它始终停留在登录页面,即使我正在登录
在这里你可以找到我的代码 (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;
}
停留在同一页面意味着您实际上并未访问您的代码。
你应该在监听器中处理这个,而不是在控制器中。
您的 class 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 }
我发现了另一种根据用户角色登录后重定向的方法
/**
* @Route("/accueil")
*/
public function redirectAction()
{
$authChecker = $this->container->get('security.authorization_checker');
if ($authChecker->isGranted('ROLE_COMPTABLE')) {
return $this->render('comptes/comptable/comptable.html.twig', array());
} elseif ($authChecker->isGranted('ROLE_VISITEUR')) {
return $this->render('comptes/visiteur/visiteur.html.twig',array());
} else {
return $this->render('userLogin.html.twig', array());
}
}
和 security.yml 在防火墙部分和主要部分
我加这个
always_use_default_target_path: false 和 default_target_path: /accueil 并且效果很好。有一件事我可能忘了告诉我我正在使用 fosuserbundle 我的功能与它配合得很好
我在 symfony 3.4 中使用 fosuserbundle。 我想在登录后重定向问题是登录后无法重定向它始终停留在登录页面,即使我正在登录 在这里你可以找到我的代码 (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;
}
停留在同一页面意味着您实际上并未访问您的代码。
你应该在监听器中处理这个,而不是在控制器中。
您的 class 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 }
我发现了另一种根据用户角色登录后重定向的方法
/**
* @Route("/accueil")
*/
public function redirectAction()
{
$authChecker = $this->container->get('security.authorization_checker');
if ($authChecker->isGranted('ROLE_COMPTABLE')) {
return $this->render('comptes/comptable/comptable.html.twig', array());
} elseif ($authChecker->isGranted('ROLE_VISITEUR')) {
return $this->render('comptes/visiteur/visiteur.html.twig',array());
} else {
return $this->render('userLogin.html.twig', array());
}
}
和 security.yml 在防火墙部分和主要部分 我加这个 always_use_default_target_path: false 和 default_target_path: /accueil 并且效果很好。有一件事我可能忘了告诉我我正在使用 fosuserbundle 我的功能与它配合得很好