godisco / acltree-bundle
Symfony2 Bundle 用于实体之间的层次关系和 ACL 权限。
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 非常简单!首先,您需要 定义您实体的父级,然后只需使用投票者来确定用户是否有权限,或者使用助手进行复杂查询。
- 定义实体父级
- 使用投票者
- AclTreeHelper - 通过 ACL 过滤实体。
- AclUsersHelper - 显示所有通过 ACL 有访问权限的用户。
定义实体父级
只需将 @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
对象。
- $queryBuilder(*) -
示例
/** @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