php - 如何根据用户使自定义操作不可访问 - Sonata Admin

标签 php symfony sonata-admin symfony-sonata sonata

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

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

这是我的路线:

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');
    }
}

但显然这是做不到的。

有人知道如何做到这一点吗?

最佳答案

我会创建 a Symfony Voter并从操作中删除检查。检查将在选民外部操作中完成,并且可以从任何地方完成,包括模板。您应该检查模板,它可能已经进行了检查。

此外,题外话的专业提示,始终在您的异常中提供一条消息。

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

关于php - 如何根据用户使自定义操作不可访问 - Sonata Admin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40846686/

相关文章:

php - 如何使用 Goutte 提交表单并获取最终 URI?

php - 检查 {{ path() }} 是否是 Symfony2 中的当前 {{ path() }}

symfony - Sonata Admin Bundle 一对多关系不保存外部 ID

symfony2 翻译奏鸣曲管理包

php - 转换数字 |整数到单词

PHP Pear Mail 无法发送带有 Unicode 字符的名称

java - 将可执行 Java(或 exe)文件嵌入到 HTML(或 php)中

php - YouTube API videoEntry计数评论

php - SQLSTATE [23000] : Integrity constraint violation: 1062 Duplicate entry in Symfony 4

php - Sonata Admin 如何读取未映射的字段?