Symfony2 / FOSUserBundle - redirection after login according to the role

I would like to configure redirection after login according to user role.

FYI: I am using symfony 2.8

I create this class:

 <?php namespace Users\UsersBundle\Redirection; use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\Security\Core\Security; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\Routing\RouterInterface; class AfterLoginRedirection implements AuthenticationSuccessHandlerInterface { protected $router; protected $security; /** * AfterLoginRedirection constructor. * @param Router $router * @param Security $security */ public function __construct(Router $router, Security $security) { $this->router = $router; $this->security = $security; } /** * @param Request $request * @param TokenInterface $token * @return RedirectResponse */ public function onAuthenticationSuccess(Request $request, TokenInterface $token) { if ($this->security->isGranted('ROLE_SUPER_ADMIN')) { $response = new RedirectResponse($this->router->generate('_homepage_admin')); } else { $referer_url = $request->headers->get('referer'); $response = new RedirectResponse($referer_url); } return $response; } } 

Create this service:

 services: redirect.after.login: class: Users\UsersBundle\Redirection\AfterLoginRedirection arguments: [@router] 

I changed the firewall

  firewalls: main: pattern: ^/ form_login: login_path: fos_user_security_login check_path: fos_user_security_check provider: fos_userbundle csrf_provider: form.csrf_provider success_handler: redirect.after.login logout: path: /users/logout target: / anonymous: true 

And I got this error:

Fatal error being truncated: argument 1 passed Users \ UsersBundle \ Redirection \ AfterLoginRedirection :: __ construct () must be an instance of Users \ UsersBundle \ Redirection \ Router, instance of the Symfony \ Bundle \ FrameworkBundle \ Routing \ Router package called by C: \ wamp \ www \ eCommerce \ app \ cache \ dev \ appDevDebugProjectContainer.php on line 2060 and defined

What did I miss? Any hints or tips?

Thanks.

+5
source share
1 answer
 <?php namespace Users\UsersBundle\Redirection; use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\Routing\Router; use Symfony\Component\Security\Core\Authorization\AuthorizationChecker; class AfterLoginRedirection implements AuthenticationSuccessHandlerInterface { protected $router; protected $security; /** * AfterLoginRedirection constructor. * @param Router $router * @param AuthorizationChecker $security */ public function __construct(Router $router, AuthorizationChecker $security) { $this->router = $router; $this->security = $security; } public function onAuthenticationSuccess(Request $request, TokenInterface $token) { if ($this->security->isGranted('ROLE_SUPER_ADMIN')) { $response = new RedirectResponse($this->router->generate('_homepage_admin')); } else { $referer_url = $request->headers->get('referer'); $response = new RedirectResponse($referer_url); } return $response; } } 

service definition:

 redirect.after.login: class: Users\UsersBundle\Redirection\AfterLoginRedirection arguments: ['@router','@security.authorization_checker'] 

The changes I made:

  • Use Router instead of RouterInterface
  • Paste @security.authorization_checker into the redirect.after.login service
+3
source

Source: https://habr.com/ru/post/1247305/


All Articles