メインコンテンツにスキップ

はじめに

インストール

go get github.com/casbin/casbin/v2

Casbin Enforcerを作成する

Casbinは、アクセス制御モデルを設定するために設定ファイルを使用します。

model.confpolicy.csv の2つの設定ファイルがあります。 model.conf はアクセスモデルを保存し、 policy.csv は特定のユーザー権限設定を保存します。 Casbinの利用方法は非常に洗練されています。 基本的には、1つの主要となる構造体が必要となります。それが enforcer です。 この構造体を構築するとき、 model.confpolicy.csv がロードされます。

言い換えると、Casbin Enforcer を作成するには、 ModelAdapter を提供する必要があります。

Casbin has a FileAdapter, see Adapter for more information.

  • Modelファイルとデフォルトの FileAdapter を使用する:
import "github.com/casbin/casbin/v2"

e, err := casbin.NewEnforcer("path/to/model.conf", "path/to/policy.csv")
  • 他のAdapterとともにModelテキストを使用する:
import (
"log"

"github.com/casbin/casbin/v2"
"github.com/casbin/casbin/v2/model"
xormadapter "github.com/casbin/xorm-adapter/v2"
_ "github.com/go-sql-driver/mysql"
)

// Initialize a Xorm adapter with MySQL database.
a, err := xormadapter.NewAdapter("mysql", "mysql_username:mysql_password@tcp(127.0.0.1:3306)/casbin")
if err != nil {
log.Fatalf("error: adapter: %s", err)
}

m, err := model.NewModelFromString(`
[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 && r.obj == p.obj && r.act == p.act
`)
if err != nil {
log.Fatalf("error: model: %s", err)
}

e, err := casbin.NewEnforcer(m, a)
if err != nil {
log.Fatalf("error: enforcer: %s", err)
}

権限のチェックする

アクセスが発生する直前のコードにEnforcementフックを追加する:

sub := "alice" // リソースにアクセスしたいユーザ
obj := "data1" // アクセスされるリソース
act := "read" // ユーザーがリソースに対して実行する操作

ok, err := e.Enforce(sub, obj, act)

if err != nil {
// エラーハンドリング
}

if ok == true {
// aliceがdata1を閲覧することを許可する
} else {
// リクエストを拒否し、エラーを表示する
}

// 複数のリクエストを一括で処理するのに BatchEnforce() を使用することも可能です。
// このメソッドはboolのsliceを返却します。このsliceのインデックスは2次元配列の行のインデックスに対応しています。
// e.g. results[0] is the result of {"alice", "data1", "read"}
results, err := e.BatchEnforce([][]interface{}{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"jack", "data3", "read"}})

Casbinは実行時の権限管理用のAPIも提供しています。 例えば、ユーザーに割り当てられたすべてのロールを以下のように取得できます。

roles, err := e.GetRolesForUser("alice")

詳細については、 Management API および RBAC API を参照してください。

その他の詳細はテストケースも参照してみてください。