godisco/acltree-bundle

Symfony2 Bundle 用于实体之间的层次关系和 ACL 权限。

安装: 1,084

依赖: 0

建议者: 0

安全: 0

星级: 17

关注者: 3

分支: 3

类型:symfony-bundle

dev-master 2014-12-01 16:56 UTC

This package is not auto-updated.

Last update: 2024-09-24 01:51:21 UTC


README

AclTree Bundle 允许您在实体之间创建用于 ACL 权限的层次关系。

例如,如果我有对 Dan Brown books 实体的 编辑 权限,我也可以编辑作者 Dan Brown 以及他的所有书籍。

目录

安装

将以下行添加到您的 composer.json 文件中,在 require 部分

composer.json
    "require": {
       "godisco/acltree-bundle": "dev-master"

AclTree Bundle 添加到您的 AppKernel(在 registerBundles() 部分中)

app/AppKernel.php
class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            // ...
            new GoDisco\AclTreeBundle\AclTreeBundle(),
    }

用法

使用 AclTree 非常简单!首先,您需要 定义您实体的父级,然后只需使用投票者来确定用户是否有权限,或者使用助手进行复杂查询。


定义实体父级

只需将 @AclParent 注解添加到您实体的父成员。

示例

use GoDisco\AclTreeBundle\Annotation\AclParent;
use Acme\AuthorBundle\Entity\Author;

/**
 * Book
 * @ORM\Table
 * @ORM\Entity
 */
class Book
{
    /**
     * @var Author
     *
     * @ORM\ManyToOne(targetEntity="Acme\AuthorBundle\Entity\Author")
     * @ORM\JoinColumn(name="author_id", referencedColumnName="id")
     * @AclParent
     */
    private $author;
}

*** 不要忘记通过添加 use GoDisco\AclTreeBundle\Annotation\AclParent; 部分来包含注解! ***

使用投票者

您可以使用常规的 Symfony ACL 投票者 来确定用户是否有权限

$vote= $this->get('security.context')->isGranted('VIEW', $entity);

(*) 关于使用投票者的更多信息,请访问 Symfony 文档


此外,您还可以将投票者作为注解使用(是的?)

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;

class BookController extends Controller
{
    /**
     * @Security("is_granted('VIEW', post)")
     */
    public function showAction(Post $post)
    {
        //...
    }
}

(*) 关于使用安全注解的更多信息,请访问 Symfony 文档

使用 AclTree 助手

为了仅过滤用户有权访问的实体,请在您的 QueryBuilder 对象上应用 @acl.tree.helper 服务

方法

  • apply(QueryBuilder $queryBuilder, [array $permissions = array("VIEW"), UserInterface $user = null])
    • $queryBuilder(*) - QueryBuilder 对象,在 过滤之前 选择所有实体。
    • $permissions - 要检查的权限数组,默认将检查 VIEW
    • $user - 要检查的用户实体,默认将检查已登录用户
    • 返回 修改后的 Query 对象。

示例

    /** @var \Doctrine\ORM\EntityManager\EntityManager $em */
    $em = $this->getDoctrine()->getManager();
    /** @var \GoDisco\AclTreeBundle\Security\Helper\AclTreeHelper $aclHelper */
    $aclHelper = $this->get("acl.tree.helper");
    
    $qb = $em->createQueryBuilder();
    $qb = $qb->select('e')
        ->from('GoDisco\EventBundle\Entity\Event', 'e')
        ->join("e.line", "l");

    // The query object returned here is a clone obj so, you can always use $qb->getQuery() to get the original query obj
    $query = $aclHelper->apply($qb);  // showing for current logged-in user
    $result = $query->getArrayResult();
    
    return $result;

使用 AclUsers 助手

要显示直接访问实体的所有用户,请将 acl.object.users 服务应用于您的 Entity 对象

方法

  • get($entity, $user_class[array $permissions = array("VIEW"))
    • $entity(*) - 要检查的实体
    • $user_class(*) - 用户对象的类
    • $permissions - 要检查的权限数组,默认将检查 EDIT
    • 返回 用户列表。

示例

    /** @var \Doctrine\ORM\EntityManager\EntityManager $em */
    $em = $this->getDoctrine()->getManager();

    $repo = $em->getRepository("VenueBundle:Venue");
    $entity = $repo->find(1);

    /** @var \GoDisco\AclTreeBundle\Security\Helper\AclUsersHelper $aclHelper */
    $aclHelper = $this->get("acl.object.users");
    
    $users = $aclUsers->get($entity, 'Acme\UserBundle\Entity\User'); // showing for current logged-in user
    return $users;

更改默认 MaskBuilder

在某些情况下,您可能希望将默认的 MaskBuilder 改为自定义的掩码映射。您可以通过覆盖 security.acl.mask_builder 参数来修改 MaskBuilder。

例如,以下是将 AclTree 更改为使用 Sonata 的 ACL MaskBuilder 的示例。

parameters:
    security.acl.mask_builder: Sonata\AdminBundle\Security\Acl\Permission\MaskBuilder