Symfony2 - 基于角色访问的用户特定表单

时间:2014-07-31 22:56:53

标签: forms symfony drop-down-menu user-roles

我有一个表单,其中有一个类别字段下拉列表,其中包含一个(OneToMany / ManyToOne)到一个帖子实体。

情况:现在客户端必须在下拉列表中选择类别,他们可能会错误地选择错误的类别,这将转到另一个博客(如果他们选择了错误的类别)并且他们无权将其更改回适当的类别。

为了缓解这个潜在的问题,我想做两个中的一个作为解决方案:

1)根据有权访问的类别

自动设置类别

2)或限制用户仅选择他们有权访问的类别(例如,如果用户具有特定角色,则只有下拉列表才会显示此类别)

用户有一个ROLE_USER限制,允许他们只能CRUD他们有权访问的内容。

如,

  • ROLEUSER1只能访问/ category1(可以在此使用CRUD)

  • ROLEUSER2只能访问/ category2(可以在此使用CRUD)

  • ROLEUSER3只能访问/ category3(可以使用CRUD)

如何设置它以便客户端不会错误地选择错误的类别?

表格

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('title')
        ->add('body')
        ->add('author')
        ->add('category')
        ->add('file', 'file', array(
            'label'    => 'Image',
            'required' => false
        ))
        ->add('created');
}

控制器

public function job1CreateAction(Request $request)
{
    $entity = new Post();
    $form = $this->createCreateForm($entity);
    $form->handleRequest($request);

    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($entity);
        $em->flush();

        return $this->redirect($this->generateUrl('job1_show', array('id' => $entity->getId())));
    }

    return array(
        'entity' => $entity,
        'form' => $form->createView(),
    );
}

private function createCreateForm(Post $entity)
{
    $form = $this->createForm(new PostType(), $entity, array(
        'action' => $this->generateUrl('job1_create'),
        'method' => 'POST',
    ));

    $form->add('submit', 'submit', array('label' => 'Create'));

    return $form;
}

1 个答案:

答案 0 :(得分:1)

这是怎么回事? : 删除'类别'表单构建器中的字段并在控制器操作中手动设置它:

if ($this->get('security.context')->isGranted('ROLEUSER1') {
    $entity->setCategory(CATEGORY1);
}

编辑:

控制器动作:

public function job1CreateAction(Request $request)
{
    $entity = new Post();

    if ($this->get('security.context')->isGranted('ROLEUSER1') {
        $category1 = $this->getDoctrine()->getManager()->getRepository('MYBUNDLE:POST')->find(1); // we are getting category object. this is just an example cade, may be this will be different in your case

        $entity->setCategory($category1);
    }

    $form = $this->createCreateForm($entity);
    ....
}

并形成:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('title')
        ->add('body')
        ->add('author')
        //->add('category')
        ->add('file', 'file', array(
            'label'    => 'Image',
            'required' => false
        ))
        ->add('created');
}