alexshelkov/simpleacl

PHP 简单访问控制列表 (ACL)

2.0.25 2023-08-07 13:55 UTC

README

PHP 简单访问控制列表 (ACL)

Test Status Coverage Status

安装

使用 composer

在您的 composer.json 中添加以下内容

{
    "require": {
        "alexshelkov/simpleacl": "2.*"
    }
}
手册

下载库并注册 PSR-0 兼容的自动加载器。

使用方法

基本用法
理论

有四种类型的对象:规则、角色、资源和 ACL,ACL 包含规则列表。一些规则可以为某些角色授予对某些资源的访问权限。

创建规则

让我们创建一个“查看”规则,并允许“用户”对“页面”进行访问(注意:所有名称都是大小写敏感的)

$view = new Rule('View');
$view->setRole(new Role('User'));
$view->setResource(new Resource('Page'));
$view->setAction(true); // true means that we allow access

var_dump((bool)$view->isAllowed('User', 'Page')); // true
添加规则

没有 ACL 的规则没有什么意义。所以我们需要在它里面添加规则。在下一个示例中,我们在 ACL 中添加了一些规则,看看会发生什么。

$acl = new Acl();

$user = new Role('User');
$admin = new Role('Admin');

$siteFrontend = new Resource('SiteFrontend');
$siteBackend = new Resource('SiteBackend');

$acl->addRule($user, $siteFrontend, new Rule('View'), true);
$acl->addRule($admin, $siteFrontend, 'View', true); // you can use string as rule
$acl->addRule($admin, $siteBackend, 'View', true);

var_dump($acl->isAllowed('User', 'SiteFrontend', 'View')); // true
var_dump($acl->isAllowed('User', 'SiteBackend', 'View')); // false
var_dump($acl->isAllowed('Admin', 'SiteFrontend', 'View')); // true
var_dump($acl->isAllowed('Admin', 'SiteBackend', 'View')); // true

有各种方法可以将规则添加到 ACL 中,addRule 方法接受一个到四个参数,因此您也可以这样添加规则

<?php
// before add $view rule to Acl you can set it action, role or resource
$acl->addRule($view);

// where is true -- is action
$acl->addRule($view, true);

// in that case action must be set before adding rule
$acl->addRule($user, $siteBackend, $view);
角色和资源继承

您可能在之前的示例中注意到了一些代码的重复,因为“用户”和“管理员”都被允许查看“网站前端”,我们添加了 2 个规则。但是,使用角色继承可以避免这种情况。

$acl = new Acl();

$user = new Role('User');
$admin = new Role('Admin');
$user->addChild($admin); // add user's child

$siteFrontend = new Resource('SiteFrontend');
$siteBackend = new Resource('SiteBackend');

$acl->addRule($user, $siteFrontend, 'View', true);
$acl->addRule($admin, $siteBackend, 'View', true);

var_dump($acl->isAllowed('User', 'SiteFrontend', 'View')); // true
var_dump($acl->isAllowed('User', 'SiteBackend', 'View')); // false
var_dump($acl->isAllowed('Admin', 'SiteFrontend', 'View')); // true
var_dump($acl->isAllowed('Admin', 'SiteBackend', 'View')); // true

继承也适用于资源。

使用回调函数

您可以使用回调函数创建更复杂的规则。

$acl = new Acl();

$user = new Role('User');
$siteFrontend = new Resource('SiteFrontend');

$acl->addRule($user, $siteFrontend, 'View', function (SimpleAcl\RuleResult $ruleResult) {
    echo $ruleResult->getNeedRoleName() . "\n";
    echo $ruleResult->getNeedResourceName() . "\n";
    echo $ruleResult->getPriority() . "\n";
    echo $ruleResult->getRule()->getRole()->getName() . "\n";
    echo $ruleResult->getRule()->getResource()->getName() . "\n";

    return true;
});


var_dump($acl->isAllowed('User', 'SiteFrontend', 'View')); // true

// Outputs:
// User
// SiteFrontend
// 0
// User
// SiteFrontend
// bool(true)
使用角色和资源聚合

您不仅可以检查特定角色或资源的访问权限,还可以检查聚合这些对象的对象的访问权限。这些类型的对象必须分别实现 SimpleAcl\Role\RoleAggregateInterface 和 SimpleAcl\Role\ResourceAggregateInterface。

您可以使用 SimpleAcl\Role\RoleAggregate 和 SimpleAcl\Role\ResourceAggregate 作为允许聚合的对象。

$acl = new Acl();

$user = new Role('User');
$admin = new Role('Admin');

$all = new RoleAggregate;
$all->addRole($user);
$all->addRole($admin);

$siteFrontend = new Resource('SiteFrontend');
$siteBackend = new Resource('SiteBackend');

$acl->addRule($user, $siteFrontend, 'View', true);
$acl->addRule($admin, $siteBackend, 'View', true);

var_dump($acl->isAllowed($all, 'SiteFrontend', 'View')); // true
var_dump($acl->isAllowed($all, 'SiteBackend', 'View')); // true

您可以在回调函数中访问角色和资源聚合。

$acl->addRule($user, $siteFrontend, 'View', function (SimpleAcl\RuleResult $ruleResult) {
    var_dump($ruleResult->getRoleAggregate());
    var_dump($ruleResult->getResourceAggregate());
});

var_dump($acl->isAllowed($all, 'SiteFrontend', 'View')); // true

有关更多信息,请查看维基页面。