个性化阅读
专注于IT技术分析

如何使用EventListener根据用户在Symfony 2.8中的角色将用户重定向到特定页面

本文概述

尽管可以使用FOSUserBundle根据用户在基于Symfony 2的应用程序中的角色将用户重定向到特定页面的方法更简单, 例如在应用程序控制器的某些操作中处理此类事情:

<?php

/**
 * Redirect users after login based on the granted ROLE
 * @Route("/login/redirect", name="_login_redirect")
 */
public function loginRedirectAction(Request $request)
{
    if($this->isGranted('ROLE_ADMIN'))
    {
        return $this->redirectToRoute('admin_homepage');
    }
    else if($this->isGranted('ROLE_MANAGER'))
    {
        return $this->redirectToRoute('manager_homepage');
    }
    else
    {
        return $this->redirectToRoute('default_homepage');
    }
}

有些开发人员喜欢做的事情有些复杂, 但是结构却相当复杂(例如实现登录侦听器)。在本文中, 我们将与你分享实现登录侦听器的最简单方法, 该方法将根据登录用户的角色将登录用户重定向到特定用户。

1.创建一个登录监听器

你需要做的第一步是创建LoginListener类, 该类将根据用户的角色处理重定向, 我们通常在主捆绑包内创建一个目录, 即Listeners, 并将所有侦听器类保存在其中。因此, 该类的名称空间将为AppBundle \ Listeners。该类的内容如下:

<?php 

// Change the namespace according to the location of this class in your bundle
namespace AppBundle\Listeners;

use FOS\UserBundle\Model\UserManagerInterface;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\Routing\Router;
use Symfony\Component\Security\Core\SecurityContext;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpFoundation\RedirectResponse;

class LoginListener
{
    protected $userManager;
    protected $router;
    protected $security;
    protected $dispatcher;
    
    public function __construct(UserManagerInterface $userManager, Router $router, SecurityContext $security, EventDispatcher $dispatcher)
    {
        $this->userManager = $userManager;
        $this->router = $router;
        $this->security = $security;
        $this->dispatcher = $dispatcher;
    }
    
    public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
    {
        $this->dispatcher->addListener(KernelEvents::RESPONSE, array($this, 'onKernelResponse'));
    }
    
    public function onKernelResponse(FilterResponseEvent $event)
    {
        // Important: redirect according to user Role
        if ($this->security->isGranted('ROLE_ADMIN')) {
            $event->setResponse(new RedirectResponse($this->router->generate("admin_homepage")));
        } elseif ($this->security->isGranted('ROLE_MANAGER')) {
            $event->setResponse(new RedirectResponse($this->router->generate("manager_homepage")));
        } else {
            $event->setResponse(new RedirectResponse($this->router->generate("default_homepage")));
        }  
    }
}

侦听器将期望4个参数, 我们将在稍后注册侦听器时注入这些参数。第一个参数是你为应用程序注册的用户管理器, 在本例中, 我们使用了FOSUserBundle。

2.注册登录监听器

创建类并根据已签名用户的角色修改重定向路由后, 你需要使用以下代码段在项目的services.yml文件中注册该类(请注意, 该类可能会根据文件的结构而变化以及你遵循的名称空间):

# app/config/services.yml
services:     
    login_listener:
        # path of the previously created class
        class:  AppBundle\Listeners\LoginListener
        arguments:
            userManager: "@fos_user.user_manager"
            router: "@router"
            security: "@security.context"
            dispatcher: "@event_dispatcher"
        tags:
            - { name: kernel.event_listener, event: security.interactive_login, method: onSecurityInteractiveLogin }

保存更改并使用php app / console cache清除symfony的缓存:根据用户角色, 清除并访问你的应用程序。

编码愉快!

赞(0)
未经允许不得转载:srcmini » 如何使用EventListener根据用户在Symfony 2.8中的角色将用户重定向到特定页面

评论 抢沙发

评论前必须登录!