Casbin を使用して APISIX での承認
はじめに
APISIX は Nginx や etcd に基づく高性能でスケーラブルなクラウド ネイティブ API ゲートウェイです。 これは、Apache Software Foundationによるオープンソースプロジェクトです。 それに加えて、APISIXがとても良いのは、認証のような機能を実装するために使用できる多くの偉大なプラグインのサポートです。 モニタリングルーティングなど APISIX のプラグインが(再起動なしで)ホットリロードされているという事実は、それを非常に動的にします。
しかし、APISIXを使用している間に、アプリケーションに複雑な認可ロジックを追加するシナリオがあるかもしれません。 ここで、authz-casbinがあなたを助けるかもしれません。 authz-casbin は Lua Casbin をベースにした APISIX プラグインで、さまざまなアクセス制御モデルに基づいた強力な認証を可能にします。 Casbin は、ACL、RBAC、ABACなどのアクセス制御モデルをサポートする認可ライブラリです。 もともとはGoで書かれており、それは多くの言語に移植されており、Lua CasbinはCasbinのLua実装です。 authz-casbinの開発は、コアメンバーが合意したAPISIXリポジトリ(#4674)で承認のための新しいプラグインを提案した時に始まりました。 そして、大きな変更と改善につながった役立つレビューの後、PR (#4710) が最終的にマージされました。
こ のブログで APISIXのロールベースアクセス制御(RBAC)に基づいて認証モデルを実装する方法を示すために、authz-casbinプラグインを使用します。
注意: Casbinは認証のみを行い、認証しないので、ユーザーを認証するために、他のプラグインまたはカスタムワークフローを使用する必要があります。
モデルの作成
このプラグインは、すべてのリクエストを承認するために3つのパラメータを使用します - 件名、オブジェクト、およびアクション。 ここで、subject はユーザー名ヘッダーの値で、 [username: alice] のようなものになる可能性があります。 次に、オブジェクトはアクセスされているURLパスであり、アクションはリクエストメソッドが使用されています。
/, /res1、および/res2のパスに3つのリソースを持つモデルを作成したいとします。 次のようなモデルが必要です

例えば、jackのようなすべてのユーザー( * )がホームページにアクセスできることを意味します(/)。 alice や bob のような 管理者 権限を持つユーザーは、( res1 や res2 のような) すべてのページとリソースにアクセスできます。 また、 GET リクエストメソッドのみを使用するように、管 理者権限のないユーザーを制限しましょう。 このシナリオでは、次のようにモデルを定義できます。
[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) || keyMatch(r.sub, p.sub)) && keyMatch(r.obj, p.obj) && keyMatch(r.act, p.act)
ポリシーの作成
上記のシナリオから、ポリシーは次のようになります。
p, *, /, GET
p, admin, *, *
g, alice, admin
g, bob, admin
モデルからのマッチャは以下のことを意味します:
(g(r.sub, p.sub) || keyMatch(r.sub, p. ub)) <code>: リクエストの件名は、ポリシーの件名としての役割を持っているか、リクエストの件名は、keyMatch内のポリシーの件名と一致します。keyMatchはLua Casbinの組み込み関数であり、関数の説明やその他便利な関数についてはこちらを参照してください。keyMatch(r.obj, p.obj): リクエストのオブジェクトはポリシーのオブジェクト (URLパスはこちら) に一致します。keyMatch(r.act, p.act): リクエストのアクションはポリシーのアクション (HTTP リクエストメソッドはこちら) と一致します。