php-Casbin?是一個強大的、高效的開源訪問控制框架,它支持基于各種訪問控制模型的權限管理。
Think-Casbin?是一個專為thinkphp5.1定制的Casbin的擴展包,使開發者更便捷的在thinkphp項目中使用Casbin。
安裝
創建thinkphp項目(如果沒有):
composer?create-project?topthink/think=5.1.*?tp5
在ThinkPHP項目里,安裝Think-Casbin擴展:
立即學習“PHP免費學習筆記(深入)”;
composer?require?casbin/think-adapter
發布資源:
php?think?casbin:publish
這將自動創建model配置文件config/casbin-basic-model.conf,和Casbin的配置文件config/casbin.php。
數據遷移:
由于Think-Casbin默認將Casbin的策略(Policy)存儲在數據庫中,所以需要初始化數據庫表信息。
執行前,請確保數據庫連接信息配置正確,如需單獨修改Casbin的數據庫連接信息或表名,可以修改config/casbin.php里的配置。
php?think?casbin:migrate
這將會自動創建Casbin的策略(Policy)表casbin_rule。
ThinkPHP 從?5.1.6+?版本開始,正式引入中間件的支持。
可以通過命令行指令快速生成中間件
php?think?make:middleware?Authorization
這個指令會?application/http/middleware?目錄下面生成一個?Authorization?中間件。
在中間件中,獲取當前用戶名、URI、請求方法,通過?Casbin?驗證權限:
<?php namespace apphttpmiddleware; use Casbin; use thinkfacadeSession; class Authorization { public function handle($request, Closure $next) { // 當前登錄用戶名,這里以session為例 // $user = Session::get('user_name') ?: 'test_user'; $user = Session::get('user_name'); $url = $request->url(); ????????$action?=?$request->method(); ????????if?(!$user){ ????????????return?response()->data('Unauthenticated.')->code(401); ????????} ????????if?(!Casbin::enforce($user,?$url,?$action))?{ ????????????return?response()->data('Unauthorized.')->code(403); ????????} ????????return?$next($request); ????} }
Casbin Model配置
configcasbin-basic-model.conf?配置文件:
[request_definition] r?=?sub,?obj,?act [policy_definition] p?=?sub,?obj,?act [policy_effect] e?=?some(where?(p.eft?==?allow)) [matchers] m?=?r.sub?==?p.sub?&&?keyMatch2(r.obj,?p.obj)?&&?r.act?==?p.act
驗證
在執行授權之前,先在數據庫?casbin_rule?表中添加一些默認的策略:
添加路由及其中間件:
Route::group('users',?function?()?{ ???? ????Route::get('',?function?()?{ ????????return?'Users?data.'; ????}); ????Route::get('/:id',?function?($id)?{ ????????return?'User:?'.$id; ????}); })->middleware(apphttpmiddlewareAuthorization::class);
先登錄用戶保存用戶名到?SESSION?,可以訪問?/users、/users/1?驗證一下權限。
推薦教程:《TP5》