lake / larke-auth
一个支持Laravel中ACL、RBAC、ABAC等访问控制模型的授权库。
Requires
- php: ^7.3|^8.0|^8.1|^8.2
- casbin/casbin: ^3.1
- casbin/psr3-bridge: ^1.3
- laravel/framework: ^9.0|^10.0|^11.0
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 );
此包包含 EnforcerMiddleware
、RequestMiddleware
中间件。您可以在 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 许可协议。