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

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.xdnf.cn/news/18126.html

相关文章:

  • OSCP - Proving Grounds - Vanity
  • 云计算核心技术之容器技术
  • SAP 数据脱敏工具:SNP TDO如何满足新颁敏感信息政策要求
  • 【C语言篇】操作符详解
  • 电子电气架构 --- 软件开发数字化转型
  • Python函数:装饰器
  • 三高架构杂谈
  • 软件定义汽车---创新与差异化之路
  • Jenkins全链路教程——Jenkins调用Maven构建项目
  • Kafka文件存储机制
  • 深入浅出决策树
  • (二十)深入了解 AVFoundation-编辑:使用 AVMutableVideoComposition 实现视频加水印与图层合成(下)——实战篇
  • Google 的 Opal:重新定义自动化的 AI 平台
  • Git版本控制与协作
  • 4.9 配置 开发服务器 和 请求代理
  • 汽车之家联合HarmonyOS SDK,深度构建鸿蒙生态体系
  • 使用Idea安装JDK
  • 从零开始,系统学习AI与机器学习:一份真诚的学习路线图
  • 容器化 Android 开发效率:cpolar 内网穿透服务优化远程协作流程
  • Baumer高防护相机如何通过YoloV8深度学习模型实现网球运动员和网球速度的检测分析(C#代码UI界面版)
  • WPF中BindingList<T>和List<T>
  • Conda技巧:修改Conda环境目录,节省系统盘空间
  • 学习:各种不同类型的for循环遍历,forEach/map/filter/every/some/includes/reduce的详细用法(1)
  • 【项目】分布式Json-RPC框架 - 项目介绍与前置知识准备
  • [Linux]学习笔记系列 --[mm][list_lru]
  • Redis-缓存-穿透-布隆过滤器
  • 测试Windows10IoT系统是否可以正常运行KingSCSDA3.8软件
  • Transformer架构的数学本质:从注意力机制到大模型时代的技术内核
  • 蓝凌EKP产品:JSP 性能优化和 JSTL/EL要点检查列表
  • Excel 表格数据自动填充