【发布时间】:2017-06-01 06:56:47
【问题描述】:
在 Sylius(Symfony3 捆绑包)中,我自定义了注册表以添加一些字段,特别是“帐户类型”(专业或私人)。根据类型,某些功能将不会启用。为此,我考虑赋予用户不同的角色。
由于身份验证是由 Sylius 进行的,我想知道如何覆盖默认行为以根据类型数据设置角色?
感谢您的帮助!
【问题讨论】:
标签: authentication symfony user-roles sylius
在 Sylius(Symfony3 捆绑包)中,我自定义了注册表以添加一些字段,特别是“帐户类型”(专业或私人)。根据类型,某些功能将不会启用。为此,我考虑赋予用户不同的角色。
由于身份验证是由 Sylius 进行的,我想知道如何覆盖默认行为以根据类型数据设置角色?
感谢您的帮助!
【问题讨论】:
标签: authentication symfony user-roles sylius
Sylius 没有内置角色或 rbac 系统 - 整个安全配置是使用标准 Symfony 安全系统完成的。因此,如果您需要根据用户角色区分功能,只需基于 User 模型中的 $roles 参数,并使用您的自定义防火墙覆盖 Sylius 安全配置,如 Symfony tutorial 中所述。希望它会有所帮助;)
【讨论】:
ShopUser 是一个实体,因此您应该能够通过例如在表单中明确定义的 ChoiceType 字段来设置它。如果您想修改它的默认角色,您应该在您的应用程序中覆盖ShopUser 实体(默认情况下它有一个“ROLE_USER”角色)。只需将$roles 属性视为任何其他属性,为其创建一个字段并在表单中选择它;)
我做了什么:
在 Sylius 中,有一个事件 sylius.customer.post_register 在注册后触发。我创建了一个监听器(在 services.yml 中定义):
app.registration_listener:
class: AppBundle\EventListener\RegistrationListener
tags:
- { name: kernel.event_listener, event: sylius.customer.post_register, method: setUserRole }
arguments:
- "@sylius.manager.shop_user"
ShopUserManager 作为参数传递给 setUserRole 方法。
public function __construct(ObjectManager $userManager) {
$this->userManager = $userManager;
}
在监听器中,我将 $user 对象作为事件的“主题”:
public function setUserRole(GenericEvent $event)
{
$customer = $event->getSubject();
$user = $customer->getUser();
....
$this->userManager->persist($user);
$this->userManager->flush();
}
然后我可以修改 $user(添加我的角色)并使用 ShopUserManager 保存它。
【讨论】: