gpt4 book ai didi

symfony - 如何动态为用户添加角色?

转载 作者:行者123 更新时间:2023-12-02 21:24:54 25 4
gpt4 key购买 nike

当用户登录时,无论是第一次登录还是通过现有的 cookie,我都想根据我运行的一些查询的结果为他们分配一个或多个其他用户角色。

我认为我需要创建一个事件监听器来注入(inject)安全组件和实体管理器,以便我可以运行查询并向当前用户添加角色。

我不太确定这对于事件是否可行,因为需要在授权完成之前、身份验证之后在防火墙上下文中触发该事件。

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

是否可以使用事件监听器来执行此操作?

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

最佳答案

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

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

我还没有测试过这段代码,所以它可能有一些错误。

服务.yml

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

监听器\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);
}
}
}

关于symfony - 如何动态为用户添加角色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23898085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com