【问题标题】:How to make a custom action inaccessible depending on the user - Sonata Admin如何根据用户使自定义操作无法访问 - Sonata Admin
【发布时间】:2016-11-28 14:29:03
【问题描述】:

我已经实现了克隆操作,就像在文档中一样。如何将克隆操作的访问权限限制为创建对象的用户?

我已经在我的操作中进行了拒绝访问异常检查,但是如果用户不是该对象的作者,我现在如何隐藏列表视图中的按钮。用户应该仍然能够列出订单并显示它。

这是我的路线:

protected function configureRoutes(RouteCollection $collection)
{
    $collection->add('clone', $this->getRouterIdParameter().'/clone'); 
}

还有我的列表字段:

protected function configureListFields(ListMapper $listMapper)
{
    $listMapper
        ->add('_action', 'actions', array(
            'actions' => array(
                'show' => array(),
                'edit' => array(),
                'clone' => array(
                    'template' => 'AppBundle:Sonata/Button:clone_button.html.twig'
                ),
            ), 'label' => 'Actions'
        ))
    ;
}

还有我的克隆动作:

public function cloneAction($id = null)
{
    $object = $this->admin->getSubject();
    if (!$object) {
        throw new NotFoundHttpException(sprintf('Unable to find the object with id : %s', $id));
    }

    If (!$object->isAuthor($this->getUser())) {
        throw new AccessDeniedException();
    }

    $clonedObject = clone $object;

    $this->admin->create($clonedObject);
    $this->addFlash('sonata_flash_success', 'Cloned successfully');
    return new RedirectResponse($this->admin->generateUrl('edit', array('id' => $clonedObject->getId())));
}

正如您在我的克隆操作中看到的,我检查了用户是否是订单的作者。但是如何通过检查我的isAuthor 函数来完全删除列表中的按钮?

因为现在用户可以看到该按钮,但如果他未经授权克隆订单并单击该按钮,他会收到拒绝访问异常。所以我根本不想显示按钮。 编辑按钮同样重要。

我想过这样的事情:

protected function configureRoutes(RouteCollection $collection)
{
    $user = $this->getConfigurationPool()->getContainer()->get('security.token_storage')
            ->getToken()->getUser();

    If (!$object->isAuthor($user)) {
        $collection->remove('edit');
        $collection->remove('clone');
    }
}

但显然这是做不到的。

有人知道怎么做吗?

【问题讨论】:

    标签: php symfony sonata-admin symfony-sonata sonata


    【解决方案1】:

    我将创建a Symfony Voter 并从操作中删除检查。检查将在投票者外部操作中完成,并且可以从任何地方完成,包括模板。你应该检查模板,它可能已经检查过了。

    另外,离题的专业提示,总是在你的异常中提供一条消息。

    throw new AccessDeniedException('Not an author of this object');
    

    【讨论】:

    • 好的,这将使我必须做的一些事情变得更容易。但是现在问题仍然存在,如果用户无权访问,我该如何隐藏路线?该按钮将保留在那里,如果有人单击它,则会引发异常。如果用户可以使用它,我只希望显示该按钮。如果我使用纯 Symfony 工作,这很容易做到。但现在我使用奏鸣曲。
    • 检查模板,但正如我所说,可能已经有一个检查?或者你自己写的模板?它应该使用is_granted() 与路由和对象,这将调用投票者。
    • 如果你想解决这个问题,第 0 步就是找到并向我们展示按钮的模板
    • 我检查了编辑和创建按钮的模板,我发现它们确实有一个is_granted(),所以我也将该检查添加到我的克隆操作中并将其更改为我的偏好。这一切都很好知道。我现在也明白它是如何工作的了。谢谢。
    • 很高兴得知您做到了。如果您认为这应该出现在某个地方,请考虑为文档贡献一些内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 2019-01-01
    • 2013-09-06
    • 2018-07-22
    • 2018-04-29
    • 2016-04-29
    • 1970-01-01
    相关资源
    最近更新 更多