背景:
3つの異なるアプリケーションA
、B
、およびC
があり、それらはすべて同じユーザー詳細を共有しますが、それぞれに認証を実装する必要があり、作業が重複していました。
いくつかの調査の後、私はマイクロサービスの方法を採用し、認証サービスを実装することにしました。このサービスは各アプリのsecret
を保存し、ユーザーが特定のアプリにログインしようとしたときにJWTトークンを準備します。これは期待どおりに正常に機能しています。
現在:
ここで、各アプリケーションにロールと権限を持たせる必要があり、あまりカップリングを作成せずにそれを実装する方法を見つけています。現在の状況に関していくつか質問があります。
質問:
roles
テーブルとpermission
テーブルを含む別のサービスを作成する必要があります。最終結果は、ユーザーの詳細と権限を定義するペイロードを含むJWT
トークンを送信することになるため、たとえば次のようになります。
{
uid: 1,
name: '...',
email: '...'
permissions: [{
'edit': ['post', 'user'],
'delete': ['post'],
'read': ['post', 'user'],
...
}]
}
紙の上では、この構造は私には良いようです。クライアント側からの追加のネットワーク呼び出しを節約します。しかし、それは安全で十分な信頼性があるのでしょうか?
PS:実際のアプリケーションを構築するのに十分な経験はありませんが、正しい方向に進んでいることを願っています。
承認を確実に外部化する必要があります。実際、外部化された承認管理というパラダイムさえ存在します。
外部化された承認管理では、承認ロジックをアプリのビジネスロジックから分離することを選択します。これを行う理由はさまざまです。
外部化された許可管理にはさまざまな形式があります。一部のフレームワークにはツールが含まれています。 Spring SecurityまたはMicrosoftクレームベースの承認。テクノロジーに中立なアプローチが必要な場合は、ABAC( attribute-based access control )および [〜#〜] xacml [〜#〜] 、ABACの実装を調べます。
XACMLアーキテクチャーは、マイクロサービスと統合する/マイクロサービスの前にあるPEPと、事前に設定された一連のポリシーに対する承認要求を処理するPDPを定義します。
詳細については、アーキテクチャ図をご覧ください