问题描述
我想根据用户的角色自定义重定向.
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
我得到了这个错误:
可捕获的致命错误:参数1传递给 用户\ usersBundle \ redirection \ AfterLogInredirection :: __ construct() 必须是用户\ UsersBundle \ Redirection \ Router的实例,实例 给定的Symfony \ Bundle \ Frameworkbundle \ Routing \ Router \ Router, c:\ wamp \ www \ ecommerce \ app \ cache \ dev \ appdevdebugprojectContainer.php on 第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服务
问题描述
I would like to customize the redirection after login according to the user's role.
FYI : I use 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; } }
I Create this service :
services: redirect.after.login: class: Users\UsersBundle\Redirection\AfterLoginRedirection arguments: [@router]
I modified 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 :
Catchable Fatal Error: Argument 1 passed to Users\UsersBundle\Redirection\AfterLoginRedirection::__construct() must be an instance of Users\UsersBundle\Redirection\Router, instance of Symfony\Bundle\FrameworkBundle\Routing\Router given, called in C:\wamp\www\eCommerce\app\cache\dev\appDevDebugProjectContainer.php on line 2060 and defined
What does i missed ? Any clues or advices ?
Thanks.
推荐答案
<?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']
Changes I have made :
- Use Router instead of RouterInterface
- Inject @security.authorization_checker to the redirect.after.login service