目次
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 则必须完全匹配。
keyMatch2
Casbin の照合関数であり、リクエスト オブジェクトおよびポリシー オブジェクト内のワイルドカードを含む文字列を照合するために使用されます。
具体的には、keyMatch2
この関数はワイルドカード コロン ( :
) をサポートしており、任意の長さの文字列に一致します。たとえば、リクエスト オブジェクトがあり、/users/123
ポリシー オブジェクトがであるとします。ワイルド カード : は任意の長さの文字列に一致するため、/users/:id
これら 2 つのオブジェクトはkeyMatch2
関数。
keyMatch2
関数に加えて、Casbin はkeyMatch
、 、regexMatch
などの他のマッチング関数もサポートしています。これらの照合機能は、さまざまなビジネス シナリオに合わせてアクセス制御ポリシーをより柔軟に定義するのに役立ちます。具体的な参考資料:
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
ました。member
zhangsan
lisi
このうち、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 リクエストの認証サポートが提供されました。ただし、アクセス コントロール ポリシーの定義をより柔軟にするために、リクエスト ルーティング パラメーターをサポートしたい場合があります。