greggilbert/redoubt

Laravel 4 的资源级ACL。

1.3 2014-03-16 22:37 UTC

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.jsonrequire 部分:

{
    "require": {
        "greggilbert/redoubt": "dev-master"
    }
}

设置

  1. Greggilbert\Redoubt\RedoubtServiceProvider 添加到 app/config/app.php 中的服务提供者列表。
  2. 'Redoubt' => 'Greggilbert\Redoubt\Facades\Redoubt', 添加到 app/config/app.php 中的别名列表。
  3. 如果您正在使用 Eloquent,请运行 php artisan migrate --package=greggilbert/redoubt
  4. 可选:如果您打算重写任何基本类(例如 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 接口。您还需要发布包的配置,并更改其中列出的用户模型。