a5sys / acl-doctrine-filter-bundle
2.0.0
2022-02-08 10:32 UTC
Requires
- php: >=7.3
- doctrine/orm: >=2.2.3
- symfony/framework-bundle: ^5.0|^6.0
- symfony/service-contracts: *
README
已弃用,推荐使用 https://www.doctrine-project.org/projects/doctrine-orm/en/2.8/reference/filters.html
AclDoctrineFilterBundle
此包允许自动过滤 doctrine 实体
安装
Composer
composer require "a5sys/acl-doctrine-filter-bundle"
激活包
在 AppKernel 中添加包
new A5sys\AclDoctrineFilterBundle\AclDoctrineFilterBundle(),
配置
将 doctrine 过滤器配置添加到 config.yml
doctrine:
orm:
filters:
acl:
class: 'A5sys\AclDoctrineFilterBundle\Filter\AclFilter'
enabled: true
您还可以禁用某些角色的 ACL
acl_doctrine_filter:
no_acl_roles:
- "ROLE_ADMIN" #mandatory list of user roles that does not have acl
用法
假设您有 3 个实体
- 用户
- UserProject(用户和项目之间的链接,它是我们所使用的 acl)
- 项目
在您的代码中,如果您执行
$projectRepository->findAll();
您将获取没有任何 ACL 的所有项目
修改 Project.php 实体,添加 AclAnnotation
namespace AppBundle\Entity;
** use A5sys\AclDoctrineFilterBundle\Annotation\AclAnnotation;** use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Table(name="project")
* @ORM\Entity
* @AclAnnotation(aclSql="##TABLEALIAS##.id in (select distinct project.id from project inner join user_project ON user_project.project_id = project.id where user_project.user_id = ##USERID##)")
*/
class Project
{
....
然后,注解的 SQL 将自动附加到所有 SQL 查询中,并且永远不会检索到被禁止的实体。
对于所有您想要使用 ACL 保护的实体,您都做同样的事情。
保留关键字
##TABLEALIAS##
此关键字将被 DQL 生成的表别名自动替换
##USERID##
此关键字将被登录用户的 id 自动替换