给定一个具有静态权限的系统,如posts.create
,category.edit
等,以及可以在运行时创建的角色,两者都存储在数据库中,但权限不能(技术上不应该)改性; N:M
到users
以及roles
到roles
的关系为permissions
:
查看ACL包,乍一看,看起来我必须通过在每个请求上查询我的数据库角色并将它们添加到ACL实例以及允许的权限来构建ACL图:
// Some class like AclService.php that should be called in Module.php
// ...
$roles = // query db for all roles and their permissions
foreach ($roles as $role) {
$acl->addRole($role->getName());
foreach ($role->getPermissions() as $permission) {
$acl->allow($role->getName(), null, $permission->getName());
}
}
到目前为止,在我的控制器操作(或中间件,如果它们存在)中,我将检查是否允许用户执行操作:
// CategoryController
public function createAction() {
$user = // retrieve user from identity
if (! $acl->isAllowed($user->getRoles()->first(), null, 'categories.create')) {
// throw a 403 exception
}
}
我还没有得到的是, Resource
适合此架构的位置?我在这里错过了什么吗?
或者当权限不像categories.create
那样精细但只有create
时,资源是否合适?
答案 0 :(得分:0)
您正在使用$acl->addRole($role->getName());
但是根据文档,它应该在资源中定义。
use Zend\Permissions\Acl\Acl;
use Zend\Permissions\Acl\Role\GenericRole as Role;
use Zend\Permissions\Acl\Resource\GenericResource as Resource;
$acl = new Acl();
$acl->addRole(new Role('guest'))
->addRole(new Role('member'))
->addRole(new Role('admin'));
$parents = array('guest', 'member', 'admin');
$acl->addRole(new Role('someUser'), $parents);
$acl->addResource(new Resource('someResource'));
$acl->deny('guest', 'someResource');
$acl->allow('member', 'someResource');
echo $acl->isAllowed('someUser', 'someResource') ? 'allowed' : 'denied';
如果这没有帮助,请告诉我,我会尽力帮助。