Php symfony中的动态角色

Php symfony中的动态角色,php,symfony,authorization,roles,event-listener,Php,Symfony,Authorization,Roles,Event Listener,我一直在尝试为应用程序中的用户分配动态角色。我尝试使用一个事件侦听器来实现这一点,但它只是为一个http请求添加了动态角色 这是自定义事件侦听器中添加角色的函数 public function onSecurityInteractiveLogin(InteractiveLoginEvent $event) { $user = $this->security->getToken()->getUser(); $role = new Role; $role

我一直在尝试为应用程序中的用户分配动态角色。我尝试使用一个事件侦听器来实现这一点,但它只是为一个http请求添加了动态角色

这是自定义事件侦听器中添加角色的函数

public function onSecurityInteractiveLogin(InteractiveLoginEvent $event) {

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

    $role = new Role;
    $role->setId('ROLE_NEW');
    $user->addRole($role);
}

但我不确定这是否可能与事件侦听器有关。我只需要找到一个好方法,如何在用户登录的整个过程中添加角色。如果您能给我任何帮助和建议,我将不胜感激。

我还没有测试过这一点,但是阅读烹饪书这一点可能有用

此示例是烹饪手册中示例的修改版本,以满足您的需求

class DynamicRoleRequestListener
{
    public function __construct($session, $security)
    {
        $this->session = $session;
        $this->security = $security;
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        if (HttpKernel::MASTER_REQUEST != $event->getRequestType()) {
            // don't do anything if it's not the master request
            return;
        }

        if ($this->session->has('_is_dynamic_role_auth') && $this->session->get('_is_dynamic_role_auth') === true) {
            $role = new Role("ROLE_NEW"); //I'm assuming this implements RoleInterface
            $this->security->getRoles()[] = $role; //You might have to add credentials, too.
            $this->security->getUser()->addRole($role);
        }

        // ...
    }

    private $session;
    private $security;
}
然后将其声明为服务

services:
    kernel.listener.dynamicrolerequest:
        class: Your\DemoBundle\EventListener\DynamicRoleRequestListener
        arguments: [@session, @security.context]
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }

这里有一个类似的问题:

您可以尝试创建一个持续一个会话的角色提供者。谢谢,这是一个很好的方法。但有一个问题。函数“onKernelRequest”工作正常,除了加载页面时,加载时没有css样式表。看起来这是因为试图获取用户。你知道怎么解决吗?哦,我还有一个问题。由于新角色是动态的,并且不会在数据库中持久化,因此当我在应用程序中的任何位置使用函数flush()时,会因为该角色而出现异常。它刷新了未持久化的角色,而这正是我不想做的。是否有方法使其不尝试刷新角色?请尝试对角色使用
detach
,并且不允许对角色集合执行级联操作。