vfsoraki / roller
角色和资源管理
Requires
- illuminate/database: ^5.2
- illuminate/support: ^5.2
Requires (Dev)
- phpunit/phpunit: ^5.4
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 的默认类
用法
定义
用户是使用您的应用程序的人。他/她应该以某种方式被认证,因为这个包提供授权而不是认证。
角色是用户拥有的能力,如 admin
或 read
或 write
。当此包的方法需要角色或角色列表时,您可以提供 Collection
或 VFSoraki\Roller\Role
模型的数组或简单的角色名称字符串,甚至只是一个简单的角色名称字符串。
资源是你想要强制角色施加其上的类。例如,假设你有一个帖子类。你想允许帖子的所有者用户对其执行任何操作。你只需给创建帖子的用户分配 owner
角色即可。你还有一个 admin
角色可以访问任何帖子。此外,你还有 editor
用户可以查看任何帖子并可能编辑它们,但你不想让他们删除帖子。你只需要有 owner
、admin
和 editor
角色并将它们设置为全局或按帖子设置。然后当用户想要编辑帖子时,你检查用户是否在帖子上具有 admin
或 owner
或 editor
角色。
层次角色
此系统设计为具有层次结构,这意味着如果用户具有全局 editor
角色,则他们还具有任何资源上的 editor
角色。
同样,如果用户在帖子模型类型上具有 editor
角色,则他在创建用户或授予其 editor
角色之前或之后创建的每个实例上都具有 editor
角色。
特质
要使用此包,您应将 VFSoraki\Roller\RollerUser
特质添加到您的用户模型中。这向用户模型添加了处理角色的方法。
此外,为了简化资源的使用,将 VFSoraki\Roller\RollerResource
特质添加到您的资源中。
用法
有两种方法可用于添加角色:giveRole
和 giveRoles
,它们相同,您可以使用它们互换。
类似地,有两种方法用于检查角色:hasRole
和 hasRoles
。
添加角色
要将角色添加到用户,请使用 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
方法