nick-scalewest / laravel-authz
支持在 Laravel 中使用访问控制模型如 ACL、RBAC、ABAC 的授权库。
Requires
- php: >=7.1.0
- illuminate/console: ~5.5|~6.0|~7.0|~8.0|~9.0|~10.0|~11.0
- illuminate/database: ~5.5|~6.0|~7.0|~8.0|~9.0|~10.0|~11.0
- illuminate/support: ~5.5|~6.0|~7.0|~8.0|~9.0|~10.0|~11.0
- nick-scalewest/php-casbin: ^1.0
- nick-scalewest/psr3-bridge: ^1.0
Requires (Dev)
- laravel/laravel: ~5.5|~6.0|~7.0|~8.0|~9.0|~10.0|~11.0
- mockery/mockery: ^1.0
- php-coveralls/php-coveralls: ^2.4
- phpunit/phpunit: ~7.0|~8.0|~9.0|~10.5
README
Laravel 授权
Laravel-authz 是 Laravel 框架的授权库。
它基于 Casbin,一个支持访问控制模型如 ACL、RBAC、ABAC 的授权库。
首先您需要学习如何使用 Casbin
。
安装
在您的 Laravel 项目的 composer.json
中包含此包。这将下载该包。
composer require casbin/laravel-authz
Lauthz\LauthzServiceProvider
默认会自动发现和注册,但如果您想自己注册,请
在 config/app.php
中添加 ServiceProvider
'providers' => [ /* * Package Service Providers... */ Lauthz\LauthzServiceProvider::class, ]
Enforcer 门面也默认自动发现,但如果您想手动添加,请
在 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 配置文件。
要迁移迁移,运行 migrate 命令
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 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。
使用中间件
此包包含 EnforcerMiddleware
和 RequestMiddleware
中间件。您可以在您的 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'); });
多个 Enforcer
如果您在项目中需要多个权限控制,您可以为多个 Enforcer 配置。
在 lauthz 文件中,它应该是这样的
return [ 'default' => 'basic', 'basic' => [ 'model' => [ // ... ], 'adapter' => Lauthz\Adapters\DatabaseAdapter::class, // ... ], 'second' => [ 'model' => [ // ... ], 'adapter' => Lauthz\Adapters\DatabaseAdapter::class, // ... ], ];
然后您可以选择使用哪些 Enforcer。
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/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 许可协议授权。