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
相关产品推荐
相关产品推荐

