casbin/laravel-authz

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

v3.5.0 2024-08-07 15:18 UTC

README

Laravel授权

Laravel-authz 是一个针对 Laravel 框架的授权库。

Build Status Coverage Status Latest Stable Version Total Downloads License

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

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

安装

在您的 Laravel 项目的 composer.json 中要求此包。这将下载该包。

composer require casbin/laravel-authz

Lauthz\LauthzServiceProvider 默认是 auto-discovered 并注册的,但如果您想自己注册它

config/app.php 中添加 ServiceProvider

'providers' => [
    /*
     * Package Service Providers...
     */
    Lauthz\LauthzServiceProvider::class,
]

Enforcer facade 也是 auto-discovered,但如果您想手动添加

config/app.php 中添加 Facade

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

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

php artisan vendor:publish

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

要迁移迁移,请运行迁移命令

php artisan migrate

这将创建一个名为 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 role
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

使用中间件

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

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

基本 Enforcer 中间件

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

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

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

如果您需要授权请求,您需要首先在 config/lauthz-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');
});

使用 Gates

如果您使用 Laravel Gates 检查用户是否有权限,前提是您已将现有的用户实例设置为当前认证的用户。

$user->can('articles,read');
// For multiple enforcers
$user->can('articles,read', 'second');
// The methods cant, cannot, canAny, etc. also work

如果您需要自定义 Laravel Gates,您可以在 lauthz 文件中将 enabled_register_at_gates 设置为 false 来禁用自动注册。之后,您可以在您的 ServiceProvider 中使用 Gates::beforeGates::after 来注册自定义 Gates。有关更多详细信息,请参阅Gates

多个 Enforcer

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

在lauthz文件中,应该是这样的

return [
    'default' => 'basic',

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

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

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

        'adapter' => Lauthz\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
# Specify the ptype of the role assignment by using the --ptype option.
php artisan role:assign eve writer --ptype=g2

使用缓存

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

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

'cache' => [
    // changes whether Lauthz 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许可证