я использую fosuserbundle в symfony 3.4. я хотел перенаправить после входа в систему, проблема в том, что не могу перенаправить после входа в систему, он всегда остается на странице входа, даже если я уже вошел в систему здесь вы можете найти мой код (https://gist.github.com/Бахши-Фейсал/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;
}
хорошо, я думаю, что SecurityControler в fosuserBundle предотвращает выполнение моей функции, и я не получаю никаких ошибок, поэтому моя функция работает, но не может быть выполнена из-за SecurityController @NicoHaase
Ну, ключевой момент: согласно всему этому коду, вы только что определили какой-то метод onAuthenticationSuccess без какого-либо контекста. Как Symfony должен догадаться, что вы хотите выполнить его в определенный момент времени?
Взгляните на stackoverflow.com/questions/41440417/…, там показаны два способа решения вашей проблемы.
Вы немного запутались при создании вашего LoginHandler (а не контроллера), попробуйте следовать этому ответу, он делает именно то, что вы пытаетесь: stackoverflow.com/a/31167310/1259367
хорошо, дай мне бабло, спасибо :D
все та же проблема, даже после того, как я вхожу в систему, она остается на странице входа в систему 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 }
Я не использую метод getModifiedBy() для пользователя. il fait quoi ce méthode @Florent Cardot
Это просто атрибут объекта пользователя, например, getName() или getPassword(). Не зацикливайтесь на этом ;)
я нашел другой способ перенаправления после входа в систему в соответствии с ролью пользователя
/**
* @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, моя функция хорошо работает с ним
Вы убедились, что данный код выполняется? Как вы отлаживали свою проблему дальше?