macgriog/laravel-acl

v0.0.1 2018-01-29 13:27 UTC

This package is not auto-updated.

Last update: 2024-09-29 05:27:44 UTC


README

Build Status

Laravel ACL 包

基于用户-角色-权限的简单访问控制,来自 OctoberCMS。

工作原理

基于用户具有特定权限授予访问。

角色被认为是权限集。

用户可以有权限。

用户可以分配多个角色。

对于单个用户,所有权限都会合并。

权限持久化在 JSON 列中,例如。

{"backend.read" : 1, "backend.write" : -1, "system.shutdown": 0}

1 = 授予权限 0 = 未授予权限 -1 = 强制撤销授予的权限(例如,如果是从角色继承的)

安装

要通过 Composer 安装,请运行以下命令

composer require macgriog/laravel-acl

Laravel 5.4 和 5.3:添加 Service Provider

注意:由于 Laravel 5.5,Service Providers 已自动注册。

如果您正在使用较旧版本或已选择退出自动发现,请在 config/app.php 中添加以下内容。

'providers' => [
    Macgriog\Acl\AclServiceProvider::class,
],

数据库迁移

此包旨在与关系数据库(如 MariaDB)一起使用。它期望有两个表:usersroles。有关架构详情,请参阅 迁移文件

在新的 Laravel 安装中,您可以通过以下方式发布和运行必要的迁移

php artisan vendor:publish --provider="Macgriog\Acl\AclServiceProvider"
php artisan migrate

请注意,这将需要安装 doctrine/dbal 包。它不是作为 composer 依赖项添加的,因为运行迁移是完全可选的,具体取决于您的使用情况。

用法

用户模型

将特性添加到您的用户模型中,并定义角色关系

<?php

namespace App;

use Macgriog\Acl\Models\Role;
use Macgriog\Acl\Traits\UserPermissions;

class User extends Authenticatable
{
    use UserPermissions;

    /**
     * @return mixed
     */
    public function roles()
    {
        return $this->belongsToMany(
            Role::class,
            'role_user',
            'user_id',
            'role_id'
        );
    }

    public function getRoles()
    {
        if ($this->roles) {
            return $this->roles;
        }

        return $this->roles = $this->roles();
    }

}

现在您可以如此检查权限

$user->hasAccess('update'); // true|false if User has Permission
$user->hasAccess(['update', 'create']) // true|false if ALL permissions are given
$user->hasAnyAccess(['update', 'create']) // true|false if ANY permission is given

注意:hasAccesshasAnyAccess 将检查用户上的 is_root 属性。如果用户是 Root,则始终认为权限已授予。您可以使用 Eloquent 的属性访问器根据需要修改此行为。

并且您可以设置权限

$user->permissions = ['read' => true, 'update' => true];
$user->save();

角色模型

有一个可用的 角色类 可以直接使用。角色,像用户一样,有一个权限列。这使得定义权限集并使用角色在用户之间重用它们变得容易。

用于访问控制的路由中间件

此包提供了一个中间件,可注册在您的路由中间件组中

在 App\Http\Kernel.php 中注册

protected $routeMiddleware = [
    // ...
    'acl' => \Dreipc\Acl\Middleware\CheckPermission::class,
];

示例用法

Route::get('backend')->middleware('acl:backend.access');

它接受所需的权限作为参数,并且如果当前用户没有授予所有这些权限,则中止。

测试

通过 PHPUnit 运行测试

vendor/bin/phpunit

参考