georgebohnisch/redoubt-plus

Laravel 4 的资源级 ACL。

1.3 2014-03-16 22:37 UTC

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

{
    "require": {
        "georgebohnisch/redoubt-plus": "dev-master"
    }
}

配置

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