greggilbert / redoubt
Laravel 4 的资源级ACL。
Requires
- php: >=5.3.0
- illuminate/support: *
This package is not auto-updated.
Last update: 2024-09-14 14:50:19 UTC
README
这是一个L4包,不会为L5更新,也不会在未来任何时刻更新。如果您正在寻找一个更新更频繁的包,请尝试 BeatSwitch/lock。
Redoubt
Laravel 4 的资源级ACL。基于并受 lukaszb/django-guardian 启发,这是一个优秀的Django库。
注意:此项目正在积极开发中。接口不会更改,但未来几个月内将添加更多功能。
安装
将以下行添加到 composer.json
的 require
部分:
{ "require": { "greggilbert/redoubt": "dev-master" } }
设置
- 将
Greggilbert\Redoubt\RedoubtServiceProvider
添加到app/config/app.php
中的服务提供者列表。 - 将
'Redoubt' => 'Greggilbert\Redoubt\Facades\Redoubt',
添加到app/config/app.php
中的别名列表。 - 如果您正在使用 Eloquent,请运行
php artisan migrate --package=greggilbert/redoubt
。 - 可选:如果您打算重写任何基本类(例如 User),请运行
php artisan config:publish greggilbert/redoubt
。
用法
Redoubt 提供两个级别的权限:用户和组。用户和组可以获得对资源的访问权限,用户可以关联到组。每个资源都必须定义其权限。
Redoubt 使用 Laravel 内置的多态关系来处理其关联,因此您只需传递实际模型即可。
在资源上
资源需要实现 Greggilbert\Redoubt\Permission\PermissibleInterface
,该接口定义了一个方法,getPermissions()
。该方法需要返回一个数组,其中键是权限,值是描述。
class Article implements Greggilbert\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');
您也可以为第二个参数传递一个 Article 对象。
获取对对象有权限的用户
Redoubt::getUsers('edit', $resource);
请注意,这将返回 UserObjectPermission 模型;然后您需要调用 ->getUser()
来获取用户。
获取对对象有权限的组
Redoubt::getGroups('edit', $resource);
请注意,这将返回GroupObjectPermission模型;然后您需要调用 ->getGroup()
来获取组。
其他函数
检查用户是否在组中
User::inGroup($groups);
$groups
应该是一个包含 Group
对象的数组。
获取组中的用户
$group->getUsers()
这将返回一个包含 User
对象的集合。
扩展
Redoubt 内置了 User 类,但如果你想对其进行扩展以用于自己的项目,可以扩展 Greggilbert\Redoubt\User\EloquentUser
或实现 Greggilbert\Redoubt\User\UserInterface
接口。您还需要发布包的配置,并更改其中列出的用户模型。