我正在使用Symfony2创建自己的登录应用程序,而且我是Symfony的新用户。我知道我有FOSUserBundle可供我使用,但我想先自己学习安全性。
我的访问控制定义了3个角色:ROLE_SUPER_ADMIN,ROLE_ADMIN和ROLE_USER。此外,定义的角色还具有与之关联的其他角色,例如ROLE_ADMIN_VIEW_USERS
我不使用entity.roles上的security.context service来映射我的角色,因为我只想影响ROLE_ADMIN和ROLE_USER。注册后,每个用户都被赋予角色ROLE_USER。当具有ROLE_SUPER_ADMIN的用户查看用户或管理员的编辑页面时,我试图放入一个“使该用户成为管理员”的复选框。如果他们在实体getRoles中已经有ROLE_ADMIN,则会检查该框。
如果选中此框,我会在操作中执行此操作
if ($editForm->isValid()) {
$role = ( 'ROLE_ADMIN' === $editForm->get('role')->getViewData())
? "ROLE_ADMIN"
: "ROLE_USER";
$entity->setRoles(array($role));
$em->flush();
return $this->redirect($this->generateUrl('admin_new_edit', array('id' => $id)));
}
所以我的问题是:如果在实体中getRoles()是ROLE_ADMIN,如何选中该框?请记住,如上所述,角色映射在实体中,但角色不是。我不想使用映射实体中的角色,因为安全服务中有几个我不想使用的值。
$builder
->add('username', 'text')
->add('password', 'password')
->add('email', 'email')
->add('role', 'choice', array(
'mapped' => false,
'label' => 'Make Admin',
'value' => 'ROLE_ADMIN',
'required' => false,
//show following attribute only if entity getRoles is ROLE_ADMIN
//how do i get the value from the entity?
'attr' => array('checked'=>'checked'),
))
答案 0 :(得分:0)
我的建议是这样的:
->add('role', 'choice', array(
'mapped' => true,
'label' => 'Make Admin',
'multiple' => true,
'expanded' => true,
'choices' => array('ROLE_ADMIN' => 'Yes')
'required' => false,
))
如果实体具有名为" roles"的属性,则该值应自动从实体中获取,就像您的其他字段一样。您还可以将其他角色添加到选项数组中,您将获得每个角色的复选框。
我没有测试它,但我希望它有效。