首頁  >  文章  >  php框架  >  thinkphp中使用Casbin作為權限控制中介軟體

thinkphp中使用Casbin作為權限控制中介軟體

尚
轉載
2020-05-26 09:17:093307瀏覽

thinkphp中使用Casbin作為權限控制中介軟體

PHP-Casbin 是一個強大的、高效的開源存取控制框架,它支援基於各種存取控制模型的權限管理。

Think-Casbin 是專為ThinkPHP5.1訂製的Casbin的擴充包,讓開發者更方便的在thinkphp專案中使用Casbin。

安裝

建立thinkphp專案(如果沒有):

composer create-project topthink/think=5.1.* tp5

在ThinkPHP專案裡,安裝Think-Casbin擴充:

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 app\http\middleware;

use Casbin;
use think\facade\Session;

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->method();

        if (!$user){
            return response()->data(&#39;Unauthenticated.&#39;)->code(401);
        }

        if (!Casbin::enforce($user, $url, $action)) {
            return response()->data(&#39;Unauthorized.&#39;)->code(403);
        }

        return $next($request);
    }
}

Casbin Model設定

config\ casbin-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 表中加入一些預設的策略:

thinkphp中使用Casbin作為權限控制中介軟體

新增路由及其中介軟體:

Route::group(&#39;users&#39;, function () {
    
    Route::get(&#39;&#39;, function () {
        return &#39;Users data.&#39;;
    });

    Route::get(&#39;/:id&#39;, function ($id) {
        return &#39;User: &#39;.$id;
    });

})->middleware(\app\http\middleware\Authorization::class);

先登入使用者儲存使用者名稱到 SESSION ,可以存取 /users、/users/1 驗證權限。

推薦教學:《TP5

以上是thinkphp中使用Casbin作為權限控制中介軟體的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除