Symfony2 / FOSUserBundle - 根据角色登录后重定向
Symfony2 / FOSUserBundle - Redirect after login according to the role
我想根据用户的角色自定义登录后的重定向。
仅供参考:我使用 symfony 2.8
我创建了这个 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;
}
}
我创建了这个服务:
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: 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
我错过了什么?有什么线索或建议吗?
谢谢。
<?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
服务
我想根据用户的角色自定义登录后的重定向。
仅供参考:我使用 symfony 2.8
我创建了这个 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;
}
}
我创建了这个服务:
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: 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
我错过了什么?有什么线索或建议吗?
谢谢。
<?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
服务