im在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;
}
答案 0 :(得分:0)
停留在同一页面上意味着您实际上并未访问代码。
您应该在列表器中而不是在控制器中处理。
您的类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 }
答案 1 :(得分:0)
我发现登录后根据用户角色进行重定向的另一种方法是创建了Contoller并添加了此功能。
/**
* @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的一件事,我的功能可以很好地配合使用