voku/simpleacl

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

7.0.0 2018-02-16 15:22 UTC

README

Build Status codecov.io Scrutinizer Code Quality Codacy Badge SensioLabsInsight Latest Stable Version Total Downloads Latest Unstable Version PHP 7 ready License

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

警告:这只是一个维护分支 "https://github.com/alexshelkov/SimpleAcl/"

安装

使用 composer

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

{
    "require": {
        "voku/simpleacl": "3.*"
    }
}
手动

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

使用方法

基本用法
理论

有 4 种类型的对象: 规则角色资源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('View', 'User', 'Page')); // true
添加规则

没有 Acl 的规则没有多少意义。因此,我们需要将其添加到 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');

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

$acl->addRule($user, $siteFrontend, 'View', true);
$acl->addRule($admin, $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->getRule()->getRole()->getName() . "\n";
    echo $ruleResult->getRule()->getResource()->getName() . "\n";

    return true;
});


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

// Outputs:
// User
// SiteFrontend
// 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

了解更多信息,请参阅维基页面。