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.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…