编程很难 / 仲裁者
用于操作 Symfony ACL 的便利库
Requires
- php: >=5.3.3
- symfony/security: 2.4.*
Requires (Dev)
- mockery/mockery: 0.9.*@dev
- phpunit/phpunit: ~4.0
- satooshi/php-coveralls: dev-master
This package is auto-updated.
Last update: 2024-09-29 03:58:02 UTC
README
注意: 仲裁者假设 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
如果用户有 EDIT
或 OPERATOR
的 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]