Casbin を使用して http リクエストに対して RBAC 認証を実行し、リクエスト ルーティング パラメータのサポートを追加します

目次

要約する

バックグラウンド

実用的

キャビンのインストール

Casbin モデルを作成する

Casbinポリシーを作成する

Casbin モデルとポリシーをロードし、ルートを作成します


要約する

この記事では、Casbin を使用して HTTP リクエストに対してロールベースのアクセス制御 (RBAC) 認証を実行し、リクエストのルーティング パラメータをサポートする方法を紹介します。Go 言語の Casbin ライブラリを使用します。

バックグラウンド

Casbin は、アクセス制御モデルをサポートするライブラリであり、アプリケーションに簡単に統合できます。RBAC、ABAC などの複数のアクセス制御モデルをサポートし、さまざまなバックエンド リポジトリ (ファイル、データベースなど) と統合して、アクセス制御ポリシーの管理を容易にすることができます。

この記事では、Casbin を使用して RBAC ベースのアクセス制御を実装し、HTTP リクエストの認証サポートを提供します。

実用的

キャビンのインストール

まず、Casbin ライブラリをインストールする必要があります。次のコマンドでインストールできます。

go get -u github.com/casbin/casbin

 

Casbin モデルを作成する

Casbin では、モデルを使用して、ロール、リソース、操作などのアクセス ポリシーを定義します。単純な Casbin モデルの例を次に示します。

[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) && r.act == p.act

 上記の Casbin モデルでは、アクセス制御のためのリクエスト、ポリシー、ロール、マッチャーを定義しました。具体的には、リクエスト定義には、リクエストボディsub、リクエストオブジェクトobj、およびリクエストオペレーションの 3 つの属性が含まれますactポリシー定義はリクエスト定義と似ており、ポリシー サブジェクトsub、ポリシー オブジェクトobj、ポリシー操作の 3 つの属性が含まれますactロール定義には、ロール名g_。ロール メンバーは任意の文字列である_ことを意味します。gロール間の階層関係を定義するために使用します。マッチャーは、リクエストとポリシーがどのように照合されるかを定義します。

簡単に言うと、 sub リクエストのサブジェクトは sub ポリシーのサブジェクトを継承する必要があり、リクエスト オブジェクトとポリシー オブジェクトを照合するkeyMatch2関数act 则必须完全匹配。

keyMatch2Casbin の照合関数であり、リクエスト オブジェクトおよびポリシー オブジェクト内のワイルドカードを含む文字列を照合するために使用されます。

具体的には、keyMatch2この関数はワイルドカード コロン ( :) をサポートしており、任意の長さの文字列に一致します。たとえば、リクエスト オブジェクトがあり、/users/123ポリシー オブジェクトがであるとします。ワイルド カード : は任意の長さの文字列に一致するため、/users/:idこれら 2 つのオブジェクトはkeyMatch2関数。

keyMatch2関数に加えて、Casbin はkeyMatch、 、regexMatchなどの他のマッチング関数もサポートしています。これらの照合機能は、さまざまなビジネス シナリオに合わせてアクセス制御ポリシーをより柔軟に定義するのに役立ちます。具体的な参考資料:

casbin - マッチャーの関数

Casbinポリシーを作成する

Casbin では、ポリシーを使用して実際のアクセス制御ルールを定義します。データベースやファイルなどのさまざまなバックエンドにポリシーを保存できます。単純な Casbin ポリシーの例を次に示します。

p, member, /depts, GET
p, member, /depts/:id, GET

p, admin, /depts, POST
p, admin, /depts/:id, PUT
p, admin, /depts/:id, DELETE

g, admin, member
g, zhangsan, admin
g, lisi, member

上記の Casbin 戦略では、実際に 、 、 の 4 つの役割を定義adminましmemberzhangsanlisi

このうち、adminロールは/deptsパスの。memberロール/depts/depts/:idおよび パスの下の GET リクエスト操作へのアクセス権のみを持ちます。zhangsanロールはadminロールのアクセス権を継承するため、すべてのリクエストへのアクセス権も持ちます。/deptsパスの。lisiロールにはmemberロール。

さらに、コロン ( :) を使用してパス パラメーターを表し、リクエスト オブジェクトがパラメーター付きのパスである可能性があることを示します。このようにして、さまざまなビジネス シナリオに合わせてアクセス制御ポリシーをより柔軟に定義できます。

Casbin モデルとポリシーをロードし、ルートを作成します

次に、main.goという、次のコードを追加します。

package main

import (
	"github.com/casbin/casbin"
	"log"
	"net/http"
)

func main() {
	// 创建 Casbin 模型
	e := casbin.NewEnforcer("model.conf", "policy.csv")

	// 创建 HTTP 处理程序
	http.HandleFunc("/depts/", func(w http.ResponseWriter, r *http.Request) {
		// 获取当前用户、请求路径和请求方法
		user := r.Header.Get("X-User")
		path := r.URL.Path
		method := r.Method

		// 检查当前用户是否有权限访问该路径
		if !e.Enforce(user, path, method) {
			http.Error(w, "Forbidden", http.StatusForbidden)
			return
		}

		// 如果有权限,则继续处理请求
		// TODO: 处理请求
	})

	// 启动 HTTP 服务器
	if err := http.ListenAndServe(":8080", nil); err != nil {
		log.Fatal(err)
	}
}

上記のコードでは、まず Casbin モデルと/depts/という。ハンドラーでは、現在のユーザー、リクエスト パス、およびリクエスト メソッドを取得し、Casbin のEnforceメソッド現在のユーザーにパスへのアクセス許可があるかどうかを確認します。許可されていない場合は、HTTP ステータス コード 403 が返されます。

これで、次のコマンドを使用してアプリケーションを実行できるようになります。

go run main.go

これで、RBAC ベースのアクセス制御が正常に実装され、HTTP リクエストの認証サポートが提供されました。ただし、アクセス コントロール ポリシーの定義をより柔軟にするために、リクエスト ルーティング パラメーターをサポートしたい場合があります。

 
 

おすすめ

転載: blog.csdn.net/kingu_crimson/article/details/129816280