当前位置: 首页 > news >正文

Laravel中如何使用php-casbin

一、🚀 安装和配置

1. 安装包

composer require casbin/laravel-authz

2. 发布配置文件

php artisan vendor:publish

这会生成两个重要文件:

  • config/lauthz.php - 主配置文件
  • config/lauthz-rbac-model.conf - RBAC 模型配置文件

3. 运行数据库迁移

php artisan migrate

这里会创建 rules 表来存储权限规则。

二、💡 基本使用方法

权限管理基础操作:

use Enforcer;// 为用户添加直接权限
Enforcer::addPermissionForUser('张三', '文章', '读取');
Enforcer::addPermissionForUser('张三', '文章', '编辑');// 为用户分配角色
Enforcer::addRoleForUser('张三', '编辑者');// 为角色添加权限
Enforcer::addPolicy('编辑者', '文章', '编辑');
Enforcer::addPolicy('编辑者', '文章', '发布');// 检查权限
if (Enforcer::enforce('张三', '文章', '编辑')) {echo "张三可以编辑文章";
} else {echo "张三没有编辑文章的权限";
}

常用 API 方法

角色管理

// 获取所有角色
$roles = Enforcer::getAllRoles();// 获取用户的所有角色
$userRoles = Enforcer::getRolesForUser('张三');// 获取拥有某角色的所有用户
$users = Enforcer::getUsersForRole('编辑者');// 检查用户是否有某角色
$hasRole = Enforcer::hasRoleForUser('张三', '编辑者');// 删除用户的角色
Enforcer::deleteRoleForUser('张三', '编辑者');// 删除用户的所有角色
Enforcer::deleteRolesForUser('张三');

权限管理

// 获取用户的所有权限
$permissions = Enforcer::getPermissionsForUser('张三');// 检查用户是否有某权限
$hasPermission = Enforcer::hasPermissionForUser('张三', '文章', '编辑');// 删除用户的权限
Enforcer::deletePermissionForUser('张三', '文章', '编辑');// 删除用户的所有权限
Enforcer::deletePermissionsForUser('张三');// 删除某个权限(所有拥有此权限的用户都会失去)
Enforcer::deletePermission('文章', '编辑');

三、🛡️ 中间件使用

  1. 基础 Enforcer 中间件
// 保护需要特定权限的路由
Route::group(['middleware' => ['enforcer:文章,编辑']], function () {Route::put('/articles/{id}', 'ArticleController@update');
});// 保护需要角色的路由
Route::group(['middleware' => ['enforcer:管理员']], function () {Route::get('/admin', 'AdminController@index');
});
  1. RESTful HTTP 请求中间件

首先配置模型文件 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('articles', 'ArticleController');
});

为角色添加 RESTful 权限:

// 允许编辑者对所有文章进行 GET 和 POST 操作
Enforcer::addPolicy('编辑者', '/articles/*', '(GET)|(POST)');
// 允许管理员进行所有操作
Enforcer::addPolicy('管理员', '/articles/*', '.*');

四、⚙️ 高级配置

  1. 多个 Enforcer 配置

config/lauthz.php 中配置多个权限控制器:

return ['default' => 'basic','basic' => ['model' => ['config_type' => 'file','config_file_path' => config_path('lauthz-rbac-model.conf'),],'adapter' => Lauthz\Adapters\DatabaseAdapter::class,],'advanced' => ['model' => ['config_type' => 'file','config_file_path' => config_path('lauthz-advanced-model.conf'),],'adapter' => Lauthz\Adapters\DatabaseAdapter::class,],
];

使用指定的 Enforcer:

Enforcer::guard('advanced')->enforce('张三', '订单', '查看');
  1. 缓存配置
    config/lauthz.php 中启用缓存:
'cache' => ['enabled' => true,        // 启用缓存'store' => 'default',     // 缓存存储驱动'key' => 'lauthz_rules',  // 缓存键前缀'ttl' => 24 * 60,         // 缓存时间(分钟)
],

五、🖥️ Artisan 命令

# 为用户添加策略
php artisan policy:add "张三,文章,编辑"# 为角色添加策略
php artisan policy:add "编辑者,文章,发布"# 为用户分配角色
php artisan role:assign "张三" "编辑者"

六、🔧 实际应用示例

  1. 在控制器中使用
<?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;
use Enforcer;class ArticleController extends Controller
{public function edit($id, Request $request){$user = $request->user();// 检查用户是否有编辑权限if (!Enforcer::enforce($user->name, '文章', '编辑')) {abort(403, '您没有编辑文章的权限');}// 继续处理编辑逻辑// ...}public function index(Request $request){$user = $request->user();// 根据用户权限显示不同内容if (Enforcer::enforce($user->name, '文章', '管理')) {// 显示所有文章$articles = Article::all();} else {// 只显示用户自己的文章$articles = Article::where('user_id', $user->id)->get();}return view('articles.index', compact('articles'));}
}
  1. 在 Blade 模板中使用
@if(Enforcer::enforce(auth()->user()->name, '文章', '编辑'))<a href="{{ route('articles.edit', $article->id) }}" class="btn btn-primary">编辑文章</a>
@endif@if(Enforcer::enforce(auth()->user()->name, '文章', '删除'))<form method="POST" action="{{ route('articles.destroy', $article->id) }}">@csrf@method('DELETE')<button type="submit" class="btn btn-danger">删除文章</button></form>
@endif
  1. 用户注册时分配默认角色
// 在用户注册后
public function register(Request $request)
{$user = User::create(['name' => $request->name,'email' => $request->email,'password' => Hash::make($request->password),]);// 为新用户分配默认角色Enforcer::addRoleForUser($user->name, '普通用户');return redirect()->route('home');
}
http://www.lryc.cn/news/624311.html

相关文章:

  • Effective C++ 条款48:认识模板元编程
  • ARM 架构简明教程学习笔记
  • 23.CNN系列网络思考
  • 科伦博泰:商业化引爆点已至,冲向Biopharma的“最后一公里”
  • 基于C语言实现的HRV分析方法 —— 与Kubios和MATLAB对比
  • C++11列表初始化 {}
  • 【数据可视化-92】使用 Pyecharts 绘制乡镇街道级地图:以安徽省黄山市休宁县为例(我的老家)
  • 【数据结构】深入理解双向链表:结构、实现与对比分析
  • 后台管理系统-6-vue3之mockjs模拟和axios请求数据
  • 国产!全志T113-i 双核Cortex-A7@1.2GHz 工业开发板—ARM + DSP、RISC-V核间通信开发案例
  • 算法魅力-BFS解决多源最短路
  • go语言条件语if …else语句
  • Apache Shiro550 漏洞(CVE-2016-4437):原理剖析与实战 SOP
  • 检测手绘图中不规则曲线交点的方法和一般规则线条交点的方法
  • Alibaba Cloud Linux 3 在 Apple M 芯片 Mac 的 VMware Fusion 上部署的完整密码重置教程(二)
  • SAP 简单的AMDP demo 练习使用
  • Midjourney绘画创作入门操作创作(在线教育背景系列)
  • 广州曼顿智能断路器:让用电更聪明,生活更安心!
  • SSM-组件的批量扫描
  • Linux中基于Centos7使用lamp架构搭建个人论坛(wordpress)
  • 双通道审核智能合约更新路径:基于区块链与AI融合的编程范式分析
  • 静态网站与动态网站的区别
  • 笔试——Day42
  • 【lucene】tip文件详解
  • 高并发网络编程实战:深入理解epoll客户端的事件驱动模型
  • HAProxy使用方法以及和LVS区别
  • 图形自动化:pynput实现Win11系统动作点击录制与回放
  • axure chrome 浏览器插件的使用
  • 大数据计算引擎(三)——Elasticsearch入门
  • 某储备土地前期开发项目控制保护区桥梁自动化监测