ipunkt / permissions
laravel 4.x 的单行权限检查
Requires
- php: >=5.4.0
- illuminate/support: 4.*
This package is not auto-updated.
Last update: 2024-09-24 03:54:25 UTC
README
使用简单的单行代码检查权限: $user->can('do something', $onAnObject)
关于
此包的目的是从控制器和模型中提取权限检查代码。相反,每个模型都携带自己的 PermissionChecker 对象,然后进行权限检查。
安装
安装
将以下行添加到您的 composer.json 中
"require": {
"ipunkt/permissions": "dev-master"
}
配置
添加
'Ipunkt\Permissions\PermissionsServiceProvider'
到您的服务提供商列表中
使用
让 Usermodel 实现 CanInterface
并使用 CanTrait
。让想要执行权限检查的模型实现 HasPermissionInterface
并使用 HasPermissionTrait
这将允许您进行 $user->can('doSomething', $model);
简单使用
引入另一个处理权限管理的包,并通过它设置权限。
具有 ipunkt/permissions 支持的已知包
- ipunkt/roles
动态权限
通常,您不希望为每个用户创建单独的角色和权限来编辑自己的个人资料,即使您有系统可以这样做。为了解决这个问题,您可以替换模型的 PermissionChecker 对象。
<?PHP namespace Example; class ModelPermissionChecker extends PermissionChecker { public function checkPermission(CanInterface $user, $action) { // Give permission to do anything if the $user is the owner of this model if( $user->getId() == $this->getEntity()->owner->getKey() ) return true; // If the $user is not the owner, fall back to the usual permission management return parent::checkPermission($user, $action); } } class Model extends Eloquent implements HasPermissioninterface { use HasPermissionTrait; $checker_instance = 'Example\ModelPermissionChecker'; }
为什么是 CanTrait
此包的实际工作在 PermissionChecker 中完成,而找到正确的 PermissionChecker 在 HasPermissionTrait 中完成。那么为什么使用 $user->can('something', $onSomething)
而不是直接使用 $onSomething->checkPermission($user, 'something');
呢?
-
首先,可读性。$user->can('doSomething', $onSomething) 非常自然,并提高了代码的可理解性。
-
其次,可扩展性。
假设您刚开始您的项目。您已经选择了权限检查包,但您不想为测试用户设置每个资源的权限,因此您只定义 ID 为 0 的用户是超级用户。使用$onSomething->checkPermission($user, 'doSomething')
,您必须将每个权限检查更改为if( $user->getId() == 0 || $onSomething->checkPermission($user, 'doSomething') )
,或者进入您创建的每个 PermissionChecker 并在这里执行它。
使用 CanInterface 和 Trait,您可以简单地做到class User implements CanInterface { use CanTrait { CanTrait::can as _can; }; public function can($action, HasPermissionInterface $object) { $permission = false; if($this->getKey() == 0) $permission = true; else $permission = _can($action, $object); return $permission; } }
并维护单个位置的代码。