thinkphp中使用Casbin作為權限控制中間件

thinkphp中使用Casbin作為權限控制中間件

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(&#39;user_name&#39;) ?: &#39;test_user&#39;;         $user = Session::get(&#39;user_name&#39;);          $url = $request->url(); ????????$action?=?$request-&gt;method();  ????????if?(!$user){ ????????????return?response()-&gt;data('Unauthenticated.')-&gt;code(401); ????????}  ????????if?(!Casbin::enforce($user,?$url,?$action))?{ ????????????return?response()-&gt;data('Unauthorized.')-&gt;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?&amp;&amp;?keyMatch2(r.obj,?p.obj)?&amp;&amp;?r.act?==?p.act

驗證

在執行授權之前,先在數據庫?casbin_rule?表中添加一些默認的策略:

thinkphp中使用Casbin作為權限控制中間件

添加路由及其中間件:

Route::group('users',?function?()?{ ???? ????Route::get('',?function?()?{ ????????return?'Users?data.'; ????});  ????Route::get('/:id',?function?($id)?{ ????????return?'User:?'.$id; ????});  })-&gt;middleware(apphttpmiddlewareAuthorization::class);

先登錄用戶保存用戶名到?SESSION?,可以訪問?/users、/users/1?驗證一下權限。

推薦教程:《TP5

以上就是

? 版權聲明
THE END
喜歡就支持一下吧
點贊7 分享