ipunkt/permissions

laravel 4.x 的单行权限检查

1.0rc1 2014-09-24 12:06 UTC

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;
        }
    }

    并维护单个位置的代码。