georgebohnisch / redoubt-plus
Laravel 4 的资源级 ACL。
Requires
- php: >=5.3.0
- illuminate/support: *
This package is not auto-updated.
Last update: 2024-09-28 16:05:10 UTC
README
是 greggilbert/redoubt 的分支,增加了一些有用的功能。
Laravel 4 的资源级 ACL。基于并受到 lukaszb/django-guardian 的启发,这是一个优秀的 Django 库。
安装
将以下行添加到 composer.json
的 require
部分
{ "require": { "georgebohnisch/redoubt-plus": "dev-master" } }
配置
- 将
Georgebohnisch\Redoubt\RedoubtServiceProvider
添加到app/config/app.php
中的服务提供者列表。 - 将
'Redoubt' => 'Georgebohnisch\Redoubt\Facades\Redoubt',
添加到app/config/app.php
中的别名列表。 - 如果你使用 Eloquent,运行
php artisan migrate --package=georgebohnisch/redoubt-plus
。 - 可选:如果你计划重写任何基础类(例如 User),运行
php artisan config:publish georgebohnisch/redoubt-plus
。
用法
Redoubt 提供两个权限级别:用户和组。用户和组可以访问资源,用户可以关联到组。每个资源都必须定义权限。
Redoubt 使用 Laravel 内置的多态关系来处理其关联,因此你只需要传入实际模型。
在资源上
资源需要实现 Georgebohnisch\Redoubt\Permission\PermissibleInterface
,它定义了一个方法,getPermissions()
。该方法需要返回一个数组,其中键是权限,值是描述。
class Article implements Georgebohnisch\Redoubt\Permission\PermissibleInterface { public function getPermissions() { return array( 'edit' => 'Edit an article', 'view' => 'View an article', ); } }
这必须为每个方法定义;尝试将权限关联到未定义权限的资源将抛出错误。
创建一个组
$group = Redoubt::group()->create(array( 'name' => 'My Group', ));
要创建一个管理员组,将 'is_admin' => true,
添加到 create()
语句中。
将用户关联到资源
$resource = Article::find(1); Redoubt::allowUser('edit', $resource);
allowUser()
有一个用于用户的第三个参数;如果没有定义,它将默认为 Laravel 的 Auth
当前使用的用户。
将用户从资源中解除关联
Redoubt::disallowUser('edit', $resource);
将组关联到资源
$group = // your definition here... Redoubt::allowGroup('edit', $resource, $group);
将组从资源中解除关联
Redoubt::disallowGroup('edit', $resource, $group);
将用户关联到组
如果你使用默认配置,用户和组是 Eloquent 模型,因此你会这样做
$user->groups()->attach($group);
检查用户是否有权限
Redoubt::userCan('edit', $resource); // returns a boolean
Redoubt::userCan()
检查用户是否有权限或是否属于任何具有该权限的组。此函数将为任何属于任何管理员组的用户返回 true
。
获取用户的所有权限
Redoubt::getPermissions();
getPermissions()
可以接受三个参数:一个用户、一个对象和一个权限。所有这些参数都是可选的。如果第一个参数为空,它将使用当前用户。
以下将获取当前用户对文章的所有权限。
$permissions = Redoubt::getPermissions(null, 'Article');
同样,这将获取当前用户对编辑文章的所有权限。
$permissions = Redoubt::getPermissions(null, 'Article', 'edit');
你也可以为第二个参数传递一个文章对象。
获取具有对象权限的用户
Redoubt::getUsers('edit', $resource);
请注意,这将返回 UserObjectPermission 模型;你需要调用 ->getUser()
来获取用户。
获取具有对象权限的组
Redoubt::getGroups('edit', $resource);
请注意,这将返回 GroupObjectPermission 模型;你需要调用 ->getGroup()
来获取组。
其他函数
检查用户是否在组中
User::inGroup($groups);
$groups
应该是一个 Group
对象的数组。
获取组中的用户
$group->getUsers()
这将返回一个 User
对象的集合。
扩展
Redoubt 内置了 User 类,但如果您想将其扩展并用于自己的项目,则可以扩展 Georgebohnisch\Redoubt\User\EloquentUser
或实现 Georgebohnisch\Redoubt\User\UserInterface
接口。您还需要发布该包的配置,并更改其中列出的用户模型。