alexshelkov / simpleacl
PHP 简单访问控制列表 (ACL)
2.0.25
2023-08-07 13:55 UTC
Requires
- php: >=5.3.0
README
PHP 简单访问控制列表 (ACL)
安装
使用 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
有关更多信息,请查看维基页面。