API の概要
この概要では、Casbin API の使用方法についてのみ説明し、Casbin のインストール方法および動作方法について説明しません。 You can find those tutorials here: installation of Casbin and how Casbin works. したがって、このチュートリアルを読み始めると、完全にインストールされ、Casbinをコードにインポートしたと仮定します。
APIを強制する
CasbinのEnforceAPIから始めましょう。 model.conf
からRBACモデルを読み込み、 policy.csv
からポリシーを読み込みます。 You can learn the Model syntax here, and we won't talk about it in this tutorial. 以下の設定ファイルを理解できると仮定します。
model.conf
[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) && r.obj == p.obj && r.act == p.act
policy.csv
p, admin, data1, read
p, admin, data1, write
p, admin, data2, read
p, admin, data2, write
p, alice, data1, read
p, bob, data2, write
g, amber, admin
g, abc, admin
設定ファイルを読み込んだ後、以下のコードをお読みください。
// load information from files
enforcer, err := casbin.NewEnforcer("./example/model.conf", "./example/policy.csv")
if err != nil {
log.Fatalf("error, detail: %s", err)
}
ok, err := enforcer.Enforce("alice", "data1", "read")
このコードは、ローカルファイルからアクセス制御モデルとポリシーをロードします。 関数 casbin.NewEnforcer()
はエンフォーサーを返す。 2つのパラメータをファイルパスとして認識し、そこからファイルをロードします。 プロセスで発生したエラーは err
に保存されます。 このコードは、モデルとポリシーをロードするためにデフォルトのアダプタを使用しました。 もちろん、サードパーティ製のアダプタを使用して同じ結果を得ることができます。
Code ok, err := enforcer.Enforce("alice", "data1", "read")
はアクセス権限を確認するものです。 alice が操作読み取りで data1 にアクセスできる場合。 返される値 ok
は true
になります。そうでなければ、 false
になります。 この例では、 ok
の値は true
です。
EnforceEx API
時々、どのポリシーがリクエストを許可したのか疑問に思うかもしれないので、関数 EnforceEx()
を用意しました。 以下のように使用できます。
ok, reason, err := enforcer.EnforceEx("amber", "data1", "read")
fmt.Println(ok, reason) // true [admin data1 read]
function EnforceEx()
は戻り値の 理由の
に正確なポリシー文字列を返します。 In this example, amber
is a role of admin
, so policy p, admin, data1, read
made this request true
. このコードの出力はコメントにあります。
CasbinはこのようなAPIをたくさん用意しました。 これらの API は、基本的な関数にいくつかの追加機能を追加しました。 それらは次のとおりです:
ok, err := enforcer.EnforceWithMatcher(matcher, request)
マッチャー付き。
ok, reason, err := enforcer.EnforceExWithMatcher(matcher, request)
EnforceWithMatcher()
とEnforceEx()
の組み合わせ。boolean Array, err := enforcer.BatchEnforce(requests)
リスト・ジョブを実行し、配列を返します。
これはCasbinのシンプルな使い方です。 Casbinを使用して、これらのAPI経由で認証サーバーを開始できます。 次の段落では、他のいくつかの種類の API を紹介します。
管理API
Get API
これらの API はポリシー内の正確なオブジェクトを取得するために使用されます。 今回は、最後の例のような施行者をロードし、そこから何かを得ます。
以下のコードをお読みください:
enforcer,err := casbin.NewEnforcer("./example/model.conf", "./example/policy.csv")
if err != nil {
fmt.Printf("Error, details: %s\n", err)
}
allSubjects := enforcer.GetAllSubjects()
fmt.Println(allSubjects)
前の例と同様に、最初の4行はローカルファイルから必要な情報をロードしました。 ここではそれについてもう話しません。
コード allSubjects := enforcer.GetAllSubjects()
ポリシーファイル内のすべてのサブジェクトを取得し、配列として返しました。 その配列を印刷しました
通常、コードの出力は次のようになります:
[adminアリス・ボブ]
関数 GetAllSubjects()
を GetAllNamedSubjects()
に変更することもできます。 現在のポリシーに現れる被験者のリストを取得します。
同様に、 オブジェクト、アクション、ロール
の GetAll
関数を用意しました。 関数名の 件名
という単語を、関数にアクセスしたい場合に必要な単語に変更するだけです。
さらに、我々は政策のためのより多くの取得を持っています。 callメソッドとreturn値は上記と似ています。
policy = e.GetPolicy()
は、ポリシーのすべての認可ルールを取得します。filteredPolicy := e.GetFilteredPolicy(0, "alice")
は、ポリシー内のすべての認可ルールを取得し、フィールドフィルタを指定することができます。namedPolicy := e.GetNamedPolicy("p")
は、指定されたポリシー内のすべての認可ルールを取得します。filteredNamedPolicy = e.GetFilteredNamedPolicy("p", 0, "bob")
は、名前付きポリシー内のすべての認可ルールを取得し、フィールドフィルタを指定することができます。groupingPolicy := e.GetGroupingPolicy()
は、ポリシー内のすべてのロール継承ルールを取得します。filteredGroupingPolicy := e.GetFilteredGroupingPolicy(0, "alice")
は、ポリシー内のすべてのロール継承ルールを取得し、フィールドフィルタを指定することができます。namedGroupingPolicy := e.GetNamedGroupingPolicy("g")
は、ポリシーのすべてのロール継承ルールを取得します。namedGroupingPolicy := e.GetFilteredNamedGroupingPolicy("g", 0, "alice")
は、ポリシー内のすべてのロール継承ルールを取得します。
追加、削除、API の更新
Casbinはポリシー用の多くのAPIを用意しました。 これらの API を使用すると、実行時にポリシーを動的に追加、削除、または編集することができます。
このコードは、ポリシーを追加、削除、更新する方法、およびポリシーが存在することを確認する方法を示します。
// load information from files
enforcer,err := casbin.NewEnforcer("./example/model.conf", "./example/policy.csv")
if err != nil {
fmt.Printf("Error, details: %s\n", err)
}
// add a policy, then use HasPolicy() to confirm that
enforcer.AddPolicy("added_user", "data1", "read")
hasPolicy := enforcer.HasPolicy("added_user", "data1", "read")
fmt.Println(hasPolicy) // true, we added that policy successfully
// remove a policy, then use HasPolicy() to confirm that
enforcer.RemovePolicy("alice", "data1", "read")
hasPolicy = enforcer.HasPolicy("alice", "data1", "read")
fmt.Println(hasPolicy) // false, we deleted that policy successfully
// update a policy, then use HasPolicy() to confirm that
enforcer.UpdatePolicy([]string{"added_user", "data1", "read"}, []string{"added_user", "data1", "write"})
hasPolicy = enforcer.HasPolicy("added_user", "data1", "read")
fmt.Println(hasPolicy) // false, the origin policy has lapsed
hasPolicy = enforcer.HasPolicy("added_user", "data1", "write")
fmt.Println(hasPolicy) // true, the new policy is in use
これらの4種類の API を使用してポリシーを編集できます。 このように、 FilteredPolicy、NamedPolicy、FilteredNamedPolicy、GroupingPolicy、NamedGroupingPolicy、FilteredGroupingPolicy、FilteredNamedGroupingPolicy
に同じ種類のAPIを用意しました。 これらを使用するには、関数名のワード ポリシー
を上記の単語に置き換える必要があります。
また、パラメータを配列に変更する場合は、ポリシーの編集をバッチ処理できます。
例えば、以下のように機能します。
enforcer.UpdatePolicy([]string{"eve", "data3", "read"}, []string{"eve", "data3", "write"})
ポリシー
を ポリシー
に変更し、パラメータを次のように編集する場合:
enforcer.UpdatePolicies([][]string{{"eve", "data3", "read"}, {"jack", "data3", "read"}}, [][]string{{"eve", "data3", "write"}", "jack", "data3", "write"}})
これらのポリシーを一括編集できます
同じ操作は GroupingPolicy, NamedGroupingPolicy
にも有用です。
RBAC API
CasbinはRBACモデルとポリシーを変更するためのAPIを提供しています。 RBAC に慣れていれば、これらの API を簡単に使用できます。
ここでは、CasbinのRBAC APIの使用方法についてのみ説明し、RBAC自体について説明しません。 You can get more details here.
以前と同じように、モデルやポリシーをロードするためにこのコードを使用します。
enforcer,err := casbin.NewEnforcer("./example/model.conf", "./example/policy.csv")
if err != nil {
fmt.Printf("Error, details: %s\n", err)
}
次に、これらのAPIにアクセスするためにEnforcer enforcer
のインスタンスを使用します。
roles, err := enforcer.GetRolesForUser("amber")
fmt.Println(roles) // [admin]
users, err := enforcer.GetUsersForRole("admin")
fmt.Println(users) // [amber abc]
GetRolesForUser()
は、琥珀を含むすべてのロールを含む配列を返した。 この例では、amber にロール管理者が 1 つしかないため、array roles
は [admin]
です。 同様に、 GetUsersForRole()
を使用して、ユーザーがロールに属するようにすることもできます。 この関数の戻り値も配列です。
enforcer.HasRoleForUser("amber", "admin") // true
HasRoleForUser()
を使用して、ユーザーがロールに属しているかどうかを確認できます。 この例では、amber は admin のメンバーなので、関数の戻り値は true
です。
fmt.Println(enforcer.Enforce("bob", "data2", "write")) // true
enforcer.DeletePermission("data2", "write")
fmt.Println(enforcer.Enforce("bob", "data2", "write")) // false
権限を削除するには DeletePermission()
を使用できます。
fmt.Println(enforcer.Enforce("alice", "data1", "read")) // true
enforcer.DeletePermissionForUser("alice", "data1", "read")
fmt.Println(enforcer.Enforce("alice", "data1", "read")) // false
また、 DeletePermissionForUser()
を使用して、ユーザの権限を削除します。
CasbinにはこのようなAPIがたくさんあります。 これらのメソッドの呼び出しと戻り値は上記の API と同じスタイルを持ちます。 You can find these APIs in next documents.