You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Symfony 4 框架下JSON类型存储的用户角色更新异常问题

问题根因

你的setRoles方法实现逻辑不符合方法语义:$this->roles[] = $roles是将传入的角色追加到已有角色数组的末尾,自然不会覆盖原有的ROLE_ADMIN,导致最终同时存在两个角色。

修复方案

1. 修正User实体的角色方法

调整后符合Symfony用户系统的常规设计规范:

/**
 * @ORM\Column(name="roles", type="json")
 */
private $roles = [];

public function getRoles(): array
{
    $roles = $this->roles;
    // 保证每个用户至少有基础角色ROLE_USER,符合Symfony安全组件要求
    if (!in_array('ROLE_USER', $roles, true)) {
        $roles[] = 'ROLE_USER';
    }
    return array_unique($roles);
}

// 入参改为数组,对应JSON字段的存储类型,方法语义为覆盖整个角色列表
public function setRoles(array $roles): self
{
    $this->roles = $roles;
    return $this;
}

// 追加单个角色的场景可额外新增该方法
public function addRole(string $role): self
{
    if (!in_array($role, $this->roles, true)) {
        $this->roles[] = $role;
    }
    return $this;
}

2. 调整控制器调用代码

修改后直接传入仅包含目标角色的数组,即可覆盖原有角色:

public function updateuser(Request $request, $id) {
    $entityManager = $this->getDoctrine()->getManager();
    $usr = $this->getDoctrine()->getRepository(User::class)->find($id);
    // 传入仅包含ROLE_USER的数组,完全替换原有角色列表
    $usr->setRoles(["ROLE_USER"]);
    $entityManager->persist($usr);
    $entityManager->flush();
    // 补充后续返回逻辑
}

内容的提问来源于stack exchange,提问作者dwight

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 16:30:05