一、🚀 安裝和配置
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('文章', '編輯');
三、🛡? 中間件使用
- 基礎 Enforcer 中間件
// 保護需要特定權限的路由
Route::group(['middleware' => ['enforcer:文章,編輯']], function () {Route::put('/articles/{id}', 'ArticleController@update');
});// 保護需要角色的路由
Route::group(['middleware' => ['enforcer:管理員']], function () {Route::get('/admin', 'AdminController@index');
});
- 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/*', '.*');
四、?? 高級配置
- 多個 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('張三', '訂單', '查看');
- 緩存配置
在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 "張三" "編輯者"
六、🔧 實際應用示例
- 在控制器中使用
<?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'));}
}
- 在 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
- 用戶注冊時分配默認角色
// 在用戶注冊后
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');
}