一、🚀 安装和配置

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.pswp.cn/news/919583.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/919583.shtml
英文地址,请注明出处:http://en.pswp.cn/news/919583.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法题打卡力扣第4题:寻找两个正序数组的中位数(hard))

题目描述 提示&#xff1a; nums1.length m nums2.length n 0 < m < 1000 0 < n < 1000 1 < m n < 2000 -106 < nums1[i], nums2[i] < 106 解答思路 我的想法是先归并排序再直接返回下标中位数 代码 double findMedianSortedArrays(int* nums1,…

无人机抗噪模块技术概述!

一、 技术要点1. 传感器数据融合与滤波&#xff08;解决感知噪声&#xff09;核心思想&#xff1a;单一传感器易受干扰且不全面&#xff0c;通过融合多种传感器&#xff08;IMU惯性测量单元、GPS、气压计、磁力计、视觉传感器、激光雷达等&#xff09;的数据&#xff0c;利用算…

Horse3D游戏引擎研发笔记(六):在QtOpenGL环境下,仿Unity的材质管理Shader绘制四边形

在上一篇笔记中&#xff0c;我们已经实现了基于QtOpenGL的BufferGeometry管理VAO和EBO绘制四边形的功能。这一次&#xff0c;我们将深入探讨材质管理系统的实现&#xff0c;包括Shader的加载与编译、材质的创建与使用&#xff0c;以及如何通过材质系统绘制带有自定义Shader效果…

MySQL-分库分表(Mycat)

目录 1.介绍​ 概述 拆分策略 垂直拆分​ 水平拆分​ 实现技术​ shardingJDBC: MyCat: 2.Mycat概述 环境准备​ 分片配置 schema.xml​ server.xml 启动服务​ 分片测试​ 3.MyCat配置 schema.xml​ schema标签 datanode标签 ​datahost标签​ rule.xml …

Dubbo 的 Java 项目间调用的完整示例

1. 项目结构假设项目分为三个模块&#xff1a;api&#xff1a;定义服务接口provider&#xff1a;服务提供者consumer&#xff1a;服务消费者2. 依赖配置在 pom.xml 中添加 Dubbo 和注册中心&#xff08;如 Nacos&#xff09;的依赖&#xff1a;<dependency><groupId&g…

Python进行中文分词

1. jieba库概述 jieba&#xff08;“结巴”&#xff09;是Python中最流行的中文分词库&#xff0c;采用基于前缀词典实现的高效分词算法&#xff0c;支持多种分词模式&#xff0c;是中文自然语言处理(NLP)的基础工具。 核心特性 精确模式&#xff1a;试图将句子最精确地切开&am…

JavaScript 性能优化实战:从原理到落地的完整指南

一、引言&#xff1a;为什么 JavaScript 性能优化至关重要&#xff1f;性能与用户体验的强关联数据支撑&#xff1a;加载延迟每增加 1 秒&#xff0c;用户转化率下降 7%&#xff08;来自 Google 研究&#xff09;核心痛点&#xff1a;现代 Web 应用中 JS 代码体积膨胀、运行时卡…

前端自动化部署

摘要&#xff1a;前端自动化部署是通过工具和流程自动化实现前端代码从开发完成到线上发布的全流程&#xff0c;减少人工操作、提高效率并降低出错风险。核心目标减少重复操作&#xff1a;自动化构建、测试、部署等步骤&#xff0c;替代手动上传服务器等低效方式。提升发布效率…

peewee中db.create_tables(tables, safe=True),safe=True作用

db.create_tables(tables, safeTrue) 中的 safeTrue 参数的作用是 防止在表已经存在的情况下引发错误。 具体来说&#xff1a; 当 safeTrue 时&#xff1a;Peewee 会在生成的 SQL 语句中加入 IF NOT EXISTS 子句&#xff08;例如&#xff1a;CREATE TABLE IF NOT EXISTS my_tab…

2025年计算机视觉与图像国际会议(ICCVI 2025)

2025年计算机视觉与图像国际会议| 视界创新&#xff0c;图领未来 2025年计算机视觉与图像国际会议&#xff08;ICCVI 2025&#xff09;将在中国东莞盛大召开。这不仅是一次汇聚全球顶尖科学家、工程师和学者的盛会&#xff0c;更是一个探索计算机视觉和图像处理领域前沿技术与未…

Temu美国站大规模扫号封店:虚假本土店遭批量封禁,如何规避?

2025年8月&#xff0c;Temu平台针对美国站再次掀起大规模扫号风暴。大量店铺因注册信息违规被判定为“高风险”&#xff0c;不仅店铺被冻结&#xff0c;商品也被下架并禁止补货。这一轮清扫&#xff0c;让不少依靠“资料店”快速起盘的卖家遭遇重创。事实上&#xff0c;Temu的风…

航空发动机叶片yolov8模型训练和转换(包含适配rk3588-pt转onnx转rknn)

前言&#xff1a; 1.训练在windows进行&#xff0c;因为电脑没有显卡&#xff0c;所以纯cpu训练&#xff0c;生成pt后转onnx 2.onnx转需要在Ubuntu虚拟机上运行 3.数据集标定快捷键 &#xff08;模型训练时不需要&#xff09;官方地址和下载pt权重&#xff1a;链接&#xff…

PyTorch如何修改模型(魔改)?/替换模型,一般除了注意输入输出一致,还有其他要修改的吗?

一、PyTorch如何修改模型&#xff08;魔改&#xff09;? 可以参考这个链接&#xff0c;看了一下还不错&#xff1a; PyTorch如何修改模型&#xff08;魔改&#xff09;_模型魔改-CSDN博客 二、替换模型&#xff0c;一般除了注意输入输出一致&#xff0c;还有其他要修改的吗?…

Pycharm Debug详解

Pycharm Debug详解看这个工具栏就是 PyCharm 调试器的“步进/断点”按钮区。常用按钮和作用&#xff08;从左到右一般是这些&#xff09;&#xff1a; Resume / 继续运行&#xff08;F9&#xff09;&#xff1a;从当前断点继续跑&#xff0c;直到下一个断点或程序结束。Step Ov…

将SSL配置迁移到Nacos的步骤

将SSL配置迁移到Nacos的步骤 要将SSL配置从本地application.yml迁移到Nacos配置中心&#xff0c;需要完成以下几个步骤&#xff1a; 1. 创建Nacos配置文件 在Nacos中创建一个新的配置文件&#xff08;例如application-ssl.yml&#xff09;&#xff0c;内容如下&#xff1a; ser…

HTTP请求参数类型及对应的后端注解

在Java后端开发中&#xff0c;HTTP请求的不同部分需要使用不同的注解来处理。以下是四种主要请求参数类型及其对应的Spring注解&#xff1a;1. 请求头(Headers)​​位置​​&#xff1a;HTTP请求的头部信息​​常用场景​​&#xff1a;认证信息(Token)、客户端信息、内容类型等…

服务器硬件电路设计之 SPI 问答(一):解密 SPI—— 从定义到核心特性

在服务器硬件电路设计中&#xff0c;SPI&#xff08;Serial Peripheral Interface&#xff0c;串行外设接口&#xff09;是一种关键的通信总线。它由摩托罗拉公司开发&#xff0c;是全双工、同步串行通信总线&#xff0c;主要用于微控制器与外围设备之间的通信&#xff0c;凭借…

【2025CVPR-目标检测方向】OW-OVD:统一的开放世界和开放词汇对象检测

研究背景与动机​ ​问题​:传统目标检测器(封闭集)需预定义所有类别,无法适应动态开放环境。现有研究多独立解决开放词汇检测(OVD)或开放世界检测(OWOD),未结合两者优势: ​OVD​:通过文本-视觉嵌入匹配实现零样本泛化,但无法主动发现未知对象。 ​OWOD​:可主动…

基于Python的就业信息推荐系统 Python+Django+Vue.js

本文项目编号 25011 &#xff0c;文末自助获取源码 \color{red}{25011&#xff0c;文末自助获取源码} 25011&#xff0c;文末自助获取源码 目录 一、系统介绍二、系统录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状 六、核心代码6.1 查询数据6.2 新…

el-date-picker type=daterange 日期范围限制

html &#xff08;组件&#xff1a;element-ui&#xff09;重点&#xff1a; :picker-options"pickerOptions"<template><el-date-pickerv-model"form.dateRange"type"daterange" value-format"yyyy-MM-dd"range-separator&q…