認証と承認は常に良いトピックです
私が取り組んでいる現在のマルチテナントサービスの承認をどのように扱うかを説明しようと思います。認証と承認は、JSON Web Tokenオープンスタンダードを使用したトークンベースです。このサービスは、あらゆる種類のクライアント(Web、モバイル、デスクトップアプリケーション)がアクセスできるREST APIを公開します。ユーザーが正常に認証されると、サービスはサーバーへの各リクエストで送信する必要があるアクセストークンを提供します。
そこで、サーバーアプリケーション上のデータをどのように認識して処理するかに基づいて、使用するいくつかの概念を紹介します。
リソース:クライアントがサービスを介してアクセスできるデータのユニットまたはグループです。制御したいすべてのリソースに、単一の名前を割り当てます。たとえば、次のエンドポイントルールがある場合、次のように名前を付けることができます。
product
/products
/products/:id
payment
/payments/
/payments/:id
order
/orders
/orders/:id
/orders/:id/products
/orders/:id/products/:id
したがって、これまでのところ、サービスには3つのリソースがあります。product、paymentおよびorder。
アクション:読み取り、作成、更新、削除など、リソースに対して実行できる操作です。従来のCRUD操作だけでなく、followたとえば、 WebSocketを使用して何らかの情報を伝達するサービスを公開したい。
能力:実行する機能actionにresource。例えば; 製品の読み取り、製品の作成など。これは基本的に単なるリソース/アクションのペアです。ただし、名前と説明を追加することもできます。
役割:ユーザーが所有できる一連の能力。たとえば、ロールにCashierは「支払いの読み取り」、「支払いの作成」Seller機能があり、ロールには「製品の読み取り」、「注文の読み取り」、「注文の更新」、「注文の削除」の機能があります。
最後に、ユーザーにはさまざまな役割を割り当てることができます。
説明
前にも言ったように、JSON Web Tokenを使用し、ユーザーが所有する能力はトークンのペイロードで宣言されています。それで、小さな小売店のために、キャッシャーとセラーの役割を同時に持つユーザーがいるとします。ペイロードは次のようになります。
{
"scopes": {
"payment": ["read", "create"],
"order": ["read", "create", "update", "delete"]
}
}
scopesクレームでわかるように、ロール(キャッシャー、セラー)の名前は指定しませんが、代わりに、関係するリソースとアクションのみが指定されます。クライアントがエンドポイントにリクエストを送信すると、サービスはアクセストークンに必要なリソースとアクションが含まれているかどうかを確認する必要があります。たとえばGET、エンドポイントへのリクエスト/payments/88は成功しますがDELETE、同じエンドポイントへのリクエストは失敗する必要があります。
もちろん、トークンを発行したユーザーと顧客(テナント)を識別するために、ペイロードに追加のプロパティを追加する必要があります。
{
"scopes": {
...
},
"tenant": "acme",
"user":"coyote"
}
この方法を使用すると、ユーザーアカウントのサービスへのアクセスを微調整できます。そして最も重要なのは、質問で指摘するように、管理者、エージェント、エンドユーザーなどのさまざまな事前定義された静的な役割を作成する必要がないことです。スーパーユーザーは、所有しているユーザーになりrole、すべてを持つresourcesとactions、それに割り当てられたサービスのを。
さて、100個のリソースがあり、それらのすべてまたはほとんどすべてにアクセスできるロールが必要な場合はどうなりますか?トークンのペイロードは巨大です。これは、リソースをネストし、アクセストークンスコープに親リソースを追加するだけで解決されます。
承認は複雑なトピックであり、各アプリケーションのニーズに応じて対処する必要があります。
payment:[read]、売り手が持っていpayment: [create]ます。この場合、許可を集約しますか?