Laravel Authorization:支持 ACL、RBAC、ABAC 等模型的授权库
Laravel Authorization 基于 Casbin ,是一个支持访问多种访问控制模型(如ACL,RBAC,ABAC等)的授权库。
在这之前,你需要先了解 Casbin
。
安装
使用 Composer
安装:
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
添加:
'aliases' => [
// ...
'Enforcer' => Lauthz\Facades\Enforcer::class,
]
要发布配置,请运行 vendor:publish
命令:
php artisan vendor:publish
这就自动创建 Model
配置文件 config/lauthz-rbac-model.conf
和 一个新的 Lauthz
配置文件 config/lauthz.php
。
要迁移迁移,请运行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
,以促进对 Policy
的各种操作:
获取所有角色:
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');
});
多个决策器
如果您的项目中需要多个权限控制,则可以配置多个 决策器
。
在 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
缓存
缓存 授权
规则可以提升性能,默认是关闭的。
在 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
项目地址:https://github.com/php-casbin/php-casbin
Laravel Authorization
项目地址:https://github.com/php-casbin/laravel-authz
你可以查看 Casbin
的完整文档 Casbin Docs.
原文地址:https://www.cnblogs.com/techone/p/11772075.html
- 17年AI在游戏中完胜人类,AlphaGo的下一个目标是什么?DeepMind有一个45年超越人类计划
- PHP常用的正则表达式
- ASP.NET Core管道深度剖析(3):管道是如何处理HTTP请求的?
- 浅析负载均衡的6种算法,Ngnix的5种算法
- 字符串的学习
- 【Scikit-Learn 中文文档】内核岭回归 - 监督学习 - 用户指南 | ApacheCN
- 可视化(番外篇)——在Eclipse RCP中玩转OpenGL
- 养良好C语言编程风格,编优质C语言代码,这才是C语言的开始
- IBM让《星球大战》中的各种黑科技变成现实
- 学习SVM(二) 如何理解支持向量机的最大分类间隔
- 解密区块链:不可编辑性带来的问题
- 学习SVM(三)理解SVM中的对偶问题
- 学习SVM(四) 理解SVM中的支持向量(Support Vector)
- 转行数据挖掘和机器学习(四)
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- 开源:推荐一个不错的离线IP地址定位库
- 武磊告别西甲!Python带你解读「全村的希望」武磊职业数据
- 谁在崛起,谁在没落?新一线城市竞争力盘点,用Python绘制动态图带你看懂!
- 两数相加
- 这样设置 IDEA,让你爽到飞起!
- Tensorflow基础入门十大操作总结
- Spring Boot 2.x基础教程:使用EhCache缓存集群
- 白平衡初探
- Activity的启动过程详解(基于10.0源码)
- Activity生命周期-你真的了解吗?
- Activity启动模式
- Redis6.0主从、哨兵、集群搭建和原理
- Linux入门学习笔记二
- 聊聊dubbo-go的tracingFilter
- 轻松学Pytorch –使用torchvision实现对象检测