Я хотел бы настроить перенаправление после входа в систему в соответствии с ролью пользователя.
FYI: я использую symfony 2.8
Я создаю этот класс:
<?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; } }
Я создаю этот сервис:
services: redirect.after.login: class: Users\UsersBundle\Redirection\AfterLoginRedirection arguments: [@router]
Я изменил брандмауэр
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
И я получил эту ошибку:
Catchable Fatal Error: аргумент 1, переданный пользователям \ UsersBundle \ Redirection \ AfterLoginRedirection :: __ construct () должен быть экземпляром Users \ UsersBundle \ Redirection \ Router, экземпляр Symfony \ Bundle \ FrameworkBundle \ Routing \ Router, указанный в C: \ wamp \ www \ eCommerce \ app \ cache \ dev \ appDevDebugProjectContainer.php в строке 2060 и определяется
Что я пропустил? Какие-нибудь подсказки или советы?
Благодарю.
<?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; } }
определение услуги:
redirect.after.login: class: Users\UsersBundle\Redirection\AfterLoginRedirection arguments: ['@router','@security.authorization_checker']
Изменения, которые я сделал:
Router
вместо RouterInterface
@security.authorization_checker
в службу redirect.after.login