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

はじめに

インストール

go get github.com/casbin/casbin/v2

Casbin Enforcerを作成する

Casbin uses configuration files to define the access control model.

There are two configuration files: model.conf and policy.csv. model.conf stores the access model, while policy.csv stores the specific user permission configuration. The usage of Casbin is very straightforward. We only need to create one main structure: enforcer. この構造体を構築するとき、 model.confpolicy.csv がロードされます。

In other words, to create a Casbin enforcer, you need to provide a Model and an Adapter.

Casbin provides a FileAdapter that you can use. See Adapter for more information.

  • Example of using the Model file and the default 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)/")
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 を参照してください。

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