lake/larke-auth

一个支持Laravel中ACL、RBAC、ABAC等访问控制模型的授权库。

1.4.0 2024-03-14 04:09 UTC

This package is auto-updated.

Last update: 2024-09-14 05:34:33 UTC


README

Laravel 授权

larke-auth 是 Laravel 框架的授权库。

代码来自 laravel-authz

它基于 Casbin,一个支持ACL、RBAC、ABAC等访问控制模型的授权库。

首先您需要学习如何使用 Casbin

安装

在您的 Laravel 项目的 composer.json 中引入此包。这将下载包。

composer require lake/larke-auth

Larke\Auth\ServiceProvider 默认为自动发现和注册,但如果您想自己注册它

config/app.php 中添加 ServiceProvider

'providers' => [
    /*
     * Package Service Providers...
     */
    Larke\Auth\ServiceProvider::class,
]

Enforcer 门面也默认为自动发现,但如果您想手动添加它

config/app.php 中添加 Facade

'aliases' => [
    // ...
    'Enforcer' => Larke\Auth\Facades\Enforcer::class,
]

要发布配置,运行 vendor 发布命令

php artisan vendor:publish --tag=larke-auth-config

这将创建一个名为 config/larkeauth-rbac-model.conf.bak 的新模型配置文件和一个名为 config/larkeauth.php.bak 的新 larkeauth 配置文件。

您需要将文件 config/larkeauth-rbac-model.conf.larkeauth 复制到文件 config/larkeauth-rbac-model.conf

并将文件 config/larkeauth.php.larkeauth 复制到文件 config/larkeauth.php

安装 auth

php artisan larke-auth:install

这将创建一个名为 rules 的新表

使用方法

快速入门

安装完成后,您可以执行类似以下操作

use Enforcer;

// adds permissions to a user
Enforcer::addPermissionForUser('eve', 'articles', 'read');
// adds a role for a user.
Enforcer::addRoleForUser('eve', 'writer');
// adds permissions to a rule
Enforcer::addPolicy('writer', 'articles','edit');

您可以检查用户是否有权限,如下所示

// to check if a user has permission
if (Enforcer::enforce("eve", "articles", "edit")) {
    // permit eve to edit articles
} else {
    // deny the request, show an error
}

使用 Enforcer Api

它提供了丰富的API,以方便对策略进行各种操作

获取所有角色

Enforcer::getAllRoles(); // ['writer', 'reader']

获取策略中的所有授权规则。

Enforcer::getPolicy();

获取用户拥有的角色。

Enforcer::getRolesForUser('eve'); // ['writer']

获取拥有角色的用户。

Enforcer::getUsersForRole('writer'); // ['eve']

确定用户是否有角色。

Enforcer::hasRoleForUser('eve', 'writer'); // true or false

为用户添加角色。

Enforcer::addRoleForUser('eve', 'writer');

为用户或角色添加权限。

// to user
Enforcer::addPermissionForUser('eve', 'articles', 'read');
// to role
Enforcer::addPermissionForUser('writer', 'articles','edit');

删除用户的角色。

Enforcer::deleteRoleForUser('eve', 'writer');

删除用户的所有角色。

Enforcer::deleteRolesForUser('eve');

删除角色。

Enforcer::deleteRole('writer');

删除权限。

Enforcer::deletePermission('articles', 'read'); // returns false if the permission does not exist (aka not affected).

删除用户或角色的权限。

Enforcer::deletePermissionForUser('eve', 'articles', 'read');

删除用户或角色的权限。

// to user
Enforcer::deletePermissionsForUser('eve');
// to role
Enforcer::deletePermissionsForUser('writer');

获取用户或角色的权限。

Enforcer::getPermissionsForUser('eve'); // return array

确定用户是否有权限。

Enforcer::hasPermissionForUser('eve', 'articles', 'read');  // true or false

有关更多API,请参阅 Casbin API

使用中间件

在此之前,您需要创建一个文件

<?php

namespace App\Auth;

use Larke\Auth\Contracts\AuthUser;

class YourAuthUser extends AuthUser
{
    /**
     * @return string|int
     */
    public function getIdentifier()
    {
        $id = ...;
        return $id;
    }
}

然后,您需要绑定 YourAuthUser

$this->app->bind(
    \Larke\Auth\Contracts\AuthUser::class, 
    \App\Auth\YourAuthUser:class
);

此包包含 EnforcerMiddlewareRequestMiddleware 中间件。您可以在 app/Http/Kernel.php 文件中添加它们。

protected $routeMiddleware = [
    // ...
    // a basic Enforcer Middleware
    'enforcer' => \Larke\Auth\Middlewares\EnforcerMiddleware::class,
    // an HTTP Request Middleware
    'http_request' => \Larke\Auth\Middlewares\RequestMiddleware::class,
];

基本 Enforcer 中间件

然后您可以使用中间件规则保护您的路由

Route::group(['middleware' => ['enforcer:articles,read']], function () {
    // pass
});

HTTP 请求中间件(也支持RESTful)

如果您需要授权请求,您需要首先在 config/larkeauth-rbac-model.conf 中定义模型配置

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[role_definition]
g = _, _

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = g(r.sub, p.sub) && keyMatch2(r.obj, p.obj) && regexMatch(r.act, p.act)

然后,使用中间件规则

Route::group(['middleware' => ['http_request']], function () {
    Route::resource('photo', 'PhotoController');
});

多个执行器

如果您在项目中需要多个权限控制,您可以配置多个执行器。

在 larkeauth 文件中,它应该是这样的

return [
    'default' => 'basic',
    
    'guards' => [
        'basic' => [
            'model' => [
                // ...
            ],

            'adapter' => Larke\Auth\Adapters\DatabaseAdapter::class,
            // ...
        ],

        'second' => [
            'model' => [
                // ...
            ],

            'adapter' => Larke\Auth\Adapters\DatabaseAdapter::class,
            // ...
        ],
    ],
    
];

然后您可以选择使用哪些执行器。

Enforcer::guard('second')->enforce("eve", "articles", "edit");

使用 artisan 命令

您可以使用 artisan 命令从控制台创建策略。

对用户

php artisan policy:add eve,articles,read

对角色

php artisan policy:add writer,articles,edit

为用户添加角色

php artisan role:assign eve writer

使用缓存

授权规则被缓存以加快性能。默认是关闭的。

在 Laravel 的 config/larkeauth.php 中设置您自己的缓存配置。

'cache' => [
    // changes whether larkeauth will cache the rules.
    'enabled' => false,

    // cache store
    'store' => 'default',

    // cache Key
    'key' => 'rules',

    // ttl \DateTimeInterface|\DateInterval|int|null
    'ttl' => 24 * 60,
],

思考

Casbin 在 Laravel 中的应用。您可以在网站上找到 Casbin 的完整文档 这里

许可协议

本项目遵循 Apache 2.0 许可协议