vfsoraki/roller

角色和资源管理

dev-master 2016-07-02 18:22 UTC

This package is not auto-updated.

Last update: 2024-09-14 19:31:12 UTC


README

简单的角色管理,带有资源范围管理,适用于 Laravel。

此包深受 rolify 的启发。

此包处于 alpha 状态,这意味着功能不完整且可能存在错误。请不要在生产环境中使用。

在此文件的末尾,有一个待办部分,其中包含了一些改进此包的想法。

安装

  • composer require vfsoraki/roller
  • 添加服务提供者 VFSoraki\Roller\RollerServiceProvider::class
  • 发布配置和迁移 php artisan vendor:publish --provider="VFSoraki\Roller\RollerServiceProvider"
  • 运行迁移 php artisan migrate
  • config/roller.php 中设置您的应用程序使用的 User 类。默认是 Laravel 的默认类

用法

定义

用户是使用您的应用程序的人。他/她应该以某种方式被认证,因为这个包提供授权而不是认证。

角色是用户拥有的能力,如 adminreadwrite。当此包的方法需要角色或角色列表时,您可以提供 CollectionVFSoraki\Roller\Role 模型的数组或简单的角色名称字符串,甚至只是一个简单的角色名称字符串。

资源是你想要强制角色施加其上的类。例如,假设你有一个帖子类。你想允许帖子的所有者用户对其执行任何操作。你只需给创建帖子的用户分配 owner 角色即可。你还有一个 admin 角色可以访问任何帖子。此外,你还有 editor 用户可以查看任何帖子并可能编辑它们,但你不想让他们删除帖子。你只需要有 owneradmineditor 角色并将它们设置为全局或按帖子设置。然后当用户想要编辑帖子时,你检查用户是否在帖子上具有 adminownereditor 角色。

层次角色

此系统设计为具有层次结构,这意味着如果用户具有全局 editor 角色,则他们还具有任何资源上的 editor 角色。

同样,如果用户在帖子模型类型上具有 editor 角色,则他在创建用户或授予其 editor 角色之前或之后创建的每个实例上都具有 editor 角色。

特质

要使用此包,您应将 VFSoraki\Roller\RollerUser 特质添加到您的用户模型中。这向用户模型添加了处理角色的方法。

此外,为了简化资源的使用,将 VFSoraki\Roller\RollerResource 特质添加到您的资源中。

用法

有两种方法可用于添加角色:giveRolegiveRoles,它们相同,您可以使用它们互换。

类似地,有两种方法用于检查角色:hasRolehasRoles

添加角色

要将角色添加到用户,请使用 giveRole 如此

// Grant globally
$user->giveRole('admin');
$user->giveRole(['read', 'write']);

// Grant on specific types
$user->giveRole('editor', Post::class);
$user->giveRole(['read', 'approve'], Post::class);

// Grant on specific instances
$user->giveRole('owner', $post);
$user->giveRole(['read', 'write'], $post);

Post 可以是任何类,对此没有限制。

请注意,$post 不必使用 VFSoraki\Roller\RollerResource 特质,但它必须是 Eloquent 模型。

还有一点,这些方法会覆盖先前的角色。这意味着在调用 giveRole 之后,用户只有第一参数中指定的角色。

查询角色

要检查用户是否有角色,请使用 hasRole

// Check global roles only
$hasRole = $user->hasRole('admin');
$hasRole = $user->hasRole(['read', 'write']);

// Check type-specific and global roles
$hasRole = $user->hasRole('editor', Post::class);
$hasRole = $user->hasRole(['read', 'approve'], Post::class);

// Check instance, type or global roles
$hasRole = $user->hasRole('owner', $post);
$hasRole = $user->hasRole(['read', 'write'], $post);

请注意,hasRole 如果用户具有请求的角色之一,则返回 true,否则返回 false

如果您选择在资源中使用 VFSoraki\Roller\RollerResource,您也可以使用该特质提供的 whoHasRoles 方法。此方法返回具有该实例指定角色的 Collection 用户集合。例如

$users = $post->whoHasRoles('owner');
$users = $post->whoHasRoles(['read', 'write', 'approve']);

请注意,此方法返回具有实例上至少一个提供角色的用户。

待办事项

  • 编写测试
  • 使用Travis
  • 使与角色的交互更加愉快,例如创建一个 getRoles 方法和一个 addRole 方法