Symfony2 / FOSUserBundle-根据角色登录后重定向。[英] Symfony2 / FOSUserBundle - Redirect after login according to the role

本文是小编为大家收集整理的关于Symfony2 / FOSUserBundle-根据角色登录后重定向。的处理/解决方法,可以参考本文帮助大家快速定位并解决问题,中文翻译不准确的可切换到English标签页查看源文。

问题描述

我想根据用户的角色自定义重定向.

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服务

本文地址:https://www.itbaoku.cn/post/2090806.html

问题描述

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