myclabs/acl

Doctrine 的 ACL 库

1.2 2014-08-20 12:09 UTC

README

MyCLabs ACL 是一个帮助管理模型权限的库。

Build Status Coverage Status Scrutinizer Code Quality Latest Stable Version Total Downloads License

它与其他 ACL 库不同,因为它专注于控制对模型类(Doctrine 实体)的访问。因此,访问控制模型遵循您的实际模型,这使得实现访问层叠变得容易(例如,如果您可以访问一个类别,您也可以访问它包含的所有子类别)。

它也尽可能地进行了优化:授权存储在数据库中,以便通过 Doctrine 查询在 SQL 层面上进行非常高效的过滤(您只能加载用户可以访问的对象)。我们所知道的没有其他 ACL 系统能够做到这一点。

要求

  • PHP 5.4
  • 使用 Doctrine 作为您模型的 ORM
  • Doctrine 2.5(目前处于测试阶段)

词汇表

  • 安全身份:将被授予某些访问权限的实体(这通常是用户)
  • 资源:我们想要控制其访问的“事物”
  • 授权:允许安全身份(用户)在资源上执行某些操作
  • 角色:角色为用户提供授权(例如,管理员、文章编辑、项目所有者等)

有两种类型的资源

  • 一个实体(例如:文章 #123)
  • 给定类型的所有实体(例如:所有文章),这由实体的类名表示

概述

我们不喜欢迷失和困惑,因此您需要做的所有 ACL 相关操作都在 ACL 服务上完成。您可以首先创建它

// full configuration shown in the documentation
$acl = new ACL($entityManager);

通过添加角色向用户授予权限

$acl->grant($user, new ArticleEditorRole($user, $article));

角色是您编写的类,它定义了用户对资源的权限。

通过删除角色从用户那里移除权限

$acl->revoke($user, $role);

测试权限

$acl->isAllowed($user, Actions::EDIT, $article);

您还可以过滤查询,仅获取用户可以访问的实体

$qb = $entityManager->createQueryBuilder();
$qb->select('article')->from('Model\Article', 'article');

ACLQueryHelper::joinACL($qb, $user, Actions::EDIT);

// This query will return only the articles the user can edit
$articles = $qb->getQuery()->getResult();

特性

  • 存储在数据库中(您不需要自己处理持久化)
  • 非常优化
    • 在数据库级别过滤查询(您不会加载用户无法访问的实体)
    • 只连接一个额外的表
    • 绕过 Doctrine 的 ORM 将授权插入数据库(快速高效)
    • 在数据库级别进行级联删除
  • 授权级联/继承
  • 授权可重建:您可以在之后更改“ArticleEditor”可以做什么,然后只需重建 ACL
  • 支持在标准操作(如“查看”、“编辑”、“删除”等)之上进行自定义操作

限制

  • 由于 Doctrine 的限制,您需要在授予或测试授权之前刷新您的资源
  • 由数据库支持:测试 isAllowed 意味着一次数据库调用