fsi / acl
FSi ACL 组件
Requires
- php: >=5.3.0
Requires (Dev)
- monolog/monolog: 1.2.*
This package is auto-updated.
Last update: 2021-02-10 10:31:24 UTC
README
请勿使用此包,因为它不会收到任何更新,并且可能会在未来被删除。
ACL - PHP 的综合访问控制列表系统
FSi ACL 组件是一组接口和类,允许在 PHP 中管理访问控制列表。它基于资源、角色和权限,可用于构建几乎任何复杂程度的访问控制系统。
基本用法
您必须创建 ACL 对象,添加资源、权限等。
<?php use FSi\Component\ACL; $acl = new ACL(); $acl->addPermission($somePermisssion); ... $acl->addResource($someResource); ... $acl->addRole($someRole); ... $acl->addACE($someACE); ...
最后检查对特定资源的访问权限
<?php if ($acl->isAllowed($someRole, $someResource, $somePermission)) { ... }
设置和自动加载
只需将 fsi/acl 添加到项目的 composer.json 文件中,然后运行 composer.phar update
或 composer.phar install
{ "require": { "fsi/acl": "0.9.*" } }
理解权限
权限定义为实现 PermissionInterface
的对象,因此几乎每个对象都可以在 ACL 系统中充当权限。对于简单情况,有一个工厂类 PermissionSimple
,它表示仅由 ACL 中唯一的标识符定义的权限(例如 'view'
、'edit'
、'delete'
等)。权限对象必须在通过 addPermission()
方法将它们注册到 ACL 中之后,才能定义任何依赖于它们的依赖项,例如访问控制条目。
理解资源
资源定义为实现 ResourceInterface
的对象,因此几乎每个对象都可以在 ACL 系统中充当资源。对于简单情况,有一个工厂类 ResourceSimple
,它表示仅由 ACL 中唯一的标识符定义的资源(例如 'news'
、'article'
、'offer'
等)。资源可以以多种方式继承其他资源。例如,资源 A 可能从三个其他资源 X、Y 和 Z 继承。多重继承在需要以多种方式授予对特定资源的访问权限时很有用,即通过授予对对象的访问权限,可以通过授予对表示该类的资源的访问权限或与它相关联的其他对象来实现。简单情况是,当需要通过授予对相关博客部分的访问权限来授予对某些博客文章的访问权限时。如果授予了其父资源的权限,则授予对资源的权限;如果撤销了对父资源的权限,则不授予对资源的权限。
理解角色
角色用于将多个资源的多个访问权限聚合在一个地方,定义为实现RoleInterface
的对象,因此任何对象都可以在ACL系统中充当角色。对于简单情况,有一个工厂类RoleSimple
,它表示仅由ACL中的唯一标识符定义的角色(例如'user'
、'editor'
、'publisher'
、'admin'
等)。角色可以以多种方式继承自其他角色。例如,角色'editor'
可以继承自角色'newsEditor'
和'articleEditor'
。如果任何父角色授予了对此资源的访问权限,并且没有任何父角色撤销此权限,则角色将对此资源授予权限。
理解访问控制条目
访问控制条目(ACE)是确定特定角色是否被授予对特定资源的特定权限的对象。有两个预定义的ACE类ACEAllow
和ACEDeny
,它们分别始终返回true和false,但任何ACE都可以创建,包含一些复杂的逻辑,以确定何时授予访问权限,何时不授予。
使用示例
以下是如何直接使用ACL的一些示例
<?php $userRole = RoleSimple::factory('user'); $newsEditorRole = RoleSimple::factory('newsEditor'); $articleEditorRole = RoleSimple::factory('articleEditor'); $publisherRole = RoleSimple::factory('publisher'); $newsResource = ResourceSimple::factory('newsClass'); $articleResource = ResourceSimple::factory('articleClass'); $view = PermissionSimple::factory('view'); $edit = PermissionSimple::factory('edit'); $publish = PermissionSimple::factory('publish'); $acl = new ACL(); $acl->addPermission($view); $acl->addPermission($edit); $acl->addPermission($publish); $acl->addResource($newsResource); $acl->addResource($articleResource); $acl->addRole($userRole); $acl->addRole($newsEditorRole); $acl->addRole($articleEditorRole); $acl->addRole($publisherRole, array($userRole, $newsEditorRole, $articleEditorRole)); $acl->addACE(new ACEAllow($userRole, $newsResource, $view)); $acl->addACE(new ACEAllow($userRole, $articleResource, $view)); $acl->addACE(new ACEAllow($newsEditorRole, $newsResource, $edit)); $acl->addACE(new ACEAllow($articleEditorRole, $articleResource, $edit)); $acl->addACE(new ACEDeny($userRole, $newsResource, $publish)); $acl->addACE(new ACEDeny($userRole, $articleResource, $publish)); $acl->isAllowed($publisherRole, $newsResource, $publish) // returns false $acl->isAllowed($publisherRole, $articleResource, $publish) // returns false $acl->isAllowed($publisherRole, $newsResource, $edit) // returns true $acl->isAllowed($publisherRole, $articleResource, $edit) // returns true
调试ACL
考虑到许多角色、资源和权限之间的复杂依赖关系,通常很难追踪特定权限何时被授予或撤销。为了使这更容易,该组件具有内置的可选日志记录功能,它使用Monolog记录在调用isAllowed()
方法期间发生的每个活动。FSi\Component\ACL\ACL
类有setLogger()
方法,它接受Monolog\Logger
实例作为参数。当设置记录器时,消息将在两个不同的级别上记录
INFO
- 在调用
isAllowed()
方法时检查过程的开始 - 记录每个调用的ACE规则及其返回的决定
- 过程的结束,包括由
isAllowed()
方法返回的最终决定
- 在调用
DEBUG
- 在遍历资源树时的附加信息
- 在遍历角色树时的附加信息