casbin / laravel-authz
一个支持Laravel中访问控制模型(如ACL、RBAC、ABAC)的授权库。
Requires
- php: >=7.1.0
- casbin/casbin: ~3.1
- casbin/psr3-bridge: ^1.1
- 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
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
- dev-master
- v3.5.0
- v3.4.0
- v3.3.0
- v3.2.0
- v3.1.6
- v3.1.5
- v3.1.4
- v3.1.3
- v3.1.2
- v3.1.1
- v3.1.0
- v3.0.2
- v3.0.1
- v3.0.0
- v2.5.1
- v2.5.0
- v2.4.0
- v2.3.5
- v2.3.4
- v2.3.3
- v2.3.2
- v2.3.1
- v2.3.0
- v2.2.0
- v2.1.0
- v2.0.0
- v1.6.0
- v1.5.0
- v1.4.0
- v1.3.0
- v1.2.0
- v1.1.0
- v1.0.0
- v0.2
- v0.1
- dev-develop
- dev-fix/support-laravel9
- dev-revert-19-pr/adapter
This package is auto-updated.
Last update: 2024-09-08 02:27:14 UTC
README
Laravel授权
Laravel-authz 是一个针对 Laravel 框架的授权库。
它基于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。
使用中间件
此包附带 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'); });
使用 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::before
或 Gates::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许可证。