编程很难/仲裁者

用于操作 Symfony ACL 的便利库

安装: 13

依赖项: 0

建议者: 0

安全性: 0

星星: 9

关注者: 2

分支: 0

公开问题: 0

语言:JavaScript

v0.4.0 2014-05-09 02:07 UTC

This package is auto-updated.

Last update: 2024-09-29 03:58:02 UTC


README

Build Status Coverage Status

注意: 仲裁者假设 Symfony 的安全组件 ACL 已设置好。

文档

仲裁者使为特定对象授予不同权限变得简单。它通过隐藏使用 Symfony 安全组件操作 ACL 的复杂性来实现这一点。

您无需担心:ACL、ACE、对象标识、安全标识、掩码构建器等。

阅读生成的 API 文档或查看下面的代码示例。

更新权限

// get the arbiter
$arbiter = $this->get('object.arbiter');

// get a user
$user = $this->get('security.context')->getToken()->getUser();

// get an entity
$document = $this->get('document.repository')->find(1);

// focus the arbiter on an entity
$arbiter->setObject($document);

// get the current permissions the user has for the $document
$permissions = $arbiter->getPermissions($user);

// add permissions
$permissions
    ->add('VIEW')
    ->add('EDIT');

// update permissions for user
$arbiter->updatePermissions($user, $permissions);

// remove permissions
$permissions->remove('EDIT');

// update permissions for user
$arbiter->updatePermissions($user, $permissions);

注意: 仲裁者内部使用 Symfony 的 BasicPermissionMap。默认情况下,仲裁者仅限于这些权限且区分大小写。

检查权限

// get a permissions object
$permissions = $arbiter->newPermissions(array('EDIT'));

// focus the arbiter on the entity
$arbiter->setObject($project);

// check permissions
$canEdit = $arbiter->isGranted($user, $permissions); // bool

建议

即使 Permissions 对象可以包含多个权限,也只需检查单个权限。默认情况下,安全组件将授予具有 Permissions 对象中任何权限的用户访问权限。例如

// get a permissions object
$permissions = $arbiter->newPermissions(array('EDIT', 'OPERATOR'));

// focus the arbiter on the entity
$arbiter->setObject($document);

// check permissions
$granted = $arbiter->isGranted($user, $permissions); // bool

如果用户有 EDITOPERATOR 的 ACE 条目,则授予访问权限。同时检查多个权限可能会造成混淆。

陷阱

由于 Symfony ACL 系统采用位掩码实现,删除权限不如想象中直接。考虑以下示例

// get a permissions object
$permissions = $arbiter->newPermissions(array('OPERATOR'));

// focus the arbiter on the entity
$arbiter->setObject($project);

// grant permissions
$arbiter->updatePermissions($user, $permissions);

// time passes and you need to adjust the user's permissions.

// get the permissions the $user currently has for the $project
$permissions = $arbiter->getPermissions($user);

// remove the DELETE permission
$permissions->remove('DELETE');

// update permissions
$arbiter->updatePermissions($user, $permissions);

由于 OPERATOR 权限在 Symfony 安全系统中推断出 DELETE 权限,有人可能会认为您可以直接删除它,并假设 $user 除了 DELETE 以外拥有所有 CRUD 权限。这是错误的,并且是错误的做法。$user 仍将拥有 OPERATOR 权限,它仍然包含 DELETE 权限。

相反,更好的方法是创建一个新的 Permissions 对象,其中只包含 $user 应该拥有的显式权限。这个新的 Permissions 对象应该在 $arbiter->updatePermissions($user, $permissions) 方法调用中使用。

在 Symfony 容器中注册仲裁者

# services.yml

services:
    object.arbiter:
        class: ProgrammingAreHard\Arbiter\Domain\ObjectArbiter
        arguments:[@security.acl.provider]