Symfony 如何向用户动态添加角色?

Symfony 如何向用户动态添加角色?,symfony,symfony-2.4,Symfony,Symfony 2.4,当用户登录时,无论是第一次登录还是通过当前的cookie登录,我都希望根据我运行的某些查询的结果为他们分配一个或多个额外的用户角色 我想我需要创建一个事件监听器来注入安全组件和实体管理器,这样我就可以运行查询并向当前用户添加角色 不过,我不太确定这是否适用于事件,因为在完成授权之前,但在进行身份验证之后,需要在防火墙上下文中触发事件 我确实看到了,但我无法让它工作(在事件运行后,角色实际上无法识别) 是否可以使用事件侦听器执行此操作 我认为我的替代方法是对用户实体使用后加载生命周期回调,并在那里

当用户登录时,无论是第一次登录还是通过当前的cookie登录,我都希望根据我运行的某些查询的结果为他们分配一个或多个额外的用户角色

我想我需要创建一个事件监听器来注入安全组件和实体管理器,这样我就可以运行查询并向当前用户添加角色

不过,我不太确定这是否适用于事件,因为在完成授权之前,但在进行身份验证之后,需要在防火墙上下文中触发事件

我确实看到了,但我无法让它工作(在事件运行后,角色实际上无法识别)

是否可以使用事件侦听器执行此操作


我认为我的替代方法是对
用户
实体使用后加载生命周期回调,并在那里运行一些查询,但这似乎不正确。

您可以在内核上创建一个事件侦听器。它将在每次加载页面时运行

它将检查他们是否是登录用户,然后您可以执行一些自定义逻辑以查看是否需要更新他们的角色,如果需要更新,则使用新设置登录他们,然后他们将继续在系统中使用新角色

我还没有测试这段代码,所以它可能有一些bug

服务.yml

bundle.eventlistener.roles:
    class: Sample\MyBundle\EventListener\Roles
    arguments: [@service_container, @security.context]
    tags:
        - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }
Listener\Roles.php

namespace Sample\MyBundle\EventListener;

use Symfony\Component\DependencyInjection\ContainerInterface as Container;
use Symfony\Component\Security\Core\SecurityContext;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;

use Sample\MyBundle\Entity\Users; //Your USER entity

class Roles {
    private $container;
    private $context;

    public function __construct(Container $container, SecurityContext $context) {
        $this->container = $container;
        $this->context = $context;
    }

    public function onKernelController(FilterControllerEvent $event) {
        if($this->context->getToken()->getUser() instanceof Users) {

            //Custom logic to see if you need to update the role or not.

            $user = $this->context->getToken()->getUser();

            //Update your roles
            $user->setRole('ROLE_WHATEVER');

            $em = $this->container->get('doctrine')->getManager();
            $em->persist($user);
            $em->flush();

            //Create new user token
            //main == firewall setting
            $token = new UsernamePasswordToken($user, $user->getPassword(), 'main', $user->getRoles());

            $this->context->setToken($token);
        }
    }
}

你用FOSUserBundle吗?我没有,我只是用我自己的学说。FOSUserBundle的特性比我需要的多得多(不需要注册、忘记密码等)。谢谢,我将尝试使用这种方法。我使用的是一个更复杂的标记,所以在Fly上创建一个新的标记不是那么容易。祝你好运,我以前没有使用过这个包,所以我不确定正确的语法是什么。