当前位置: 首页 > 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.dtcms.com/a/338295.html

相关文章:

  • MP4 文件格式验证工具
  • onRequestHide at ORIGIN_CLIENT reason HIDE_SOFT_INPUT fromUser false
  • kafka的pull的依据
  • python 数据拟合(线性拟合、多项式回归)
  • 【2025CVPR-目标检测方向】学习稳健且硬件自适应的对象检测器,以应对边缘设备的延迟攻击
  • 【K8s】K8s 服务优雅下线调试记录
  • C# NX二次开发:字符串控件StringBlock讲解
  • 【MongoDB】常见八股合集,mongodb的特性,索引使用,优化,事务,ACID,聚合查询,数据复制机制,理解其基于raft的选举机制
  • 虚拟货币(BTC)走势分析指标体系
  • JMeter与大模型融合应用之构建AI智能体:评审性能测试脚本
  • 浅入浅出常见敏感数据处理的加密算法
  • 如何在 Ubuntu 24.04 或 22.04 LTS 上安装 PowerShell
  • SHA-256 详解
  • UE5 批量编译蓝图技巧
  • Linux Miniconda安装教程与conda常用指令介绍
  • 区块链数字存证应用
  • 健身房预约系统SSM+Mybatis实现(四、登录页面+JWT+注销)
  • 【前端智能化】AG-UI实践及原理浅析
  • 决策树的笔记
  • steal tsoding‘s pastebeam code as go server
  • 芋道审批流配置流程表单超详细介绍
  • 15.web api 6
  • Unity 中控开发 多路串口服务器(一)
  • 【Goland】:数组与切片
  • 【25-cv-09352】Maradona 品牌维权,从球衣到周边全品类侵权高危
  • Jupyter 中实现交互式图表:ipywidgets 从入门到部署
  • 【数据集】全球大气监测计划(GAW)简介
  • 用户认证技术与HTTP协议
  • 基于pychrm工具的python读取 USB 摄像头(实时+保存录像+摄像头信息打印+镜像)—— OpenCV库
  • 【React Hooks】封装的艺术:如何编写高质量的 React 自-定义 Hooks