私は2年以上遅れていることを知っていますが、私が知っていることを共有し、将来の読者の苦痛を和らげることができればと思います。完全な透明性-私は決してKeycloak / OAuth / OIDCの専門家ではありません。私が知っているのは、主にドキュメント、本、古き良きYouTubeを読んだり、ツールをいじったりすることです。
この投稿は2つの部分で構成されます。 
- 私はあなたのすべての質問に私の能力の及ぶ限りでは答えようとします 
- このスレッドのコアコンセプトのいくつかをよりよく理解するために、別のアプリをデプロイする必要なしに、Keycloakでポリシー/スコープ/パーミッションを試す方法をすべて紹介します。ただし、これは主にすべてを開始することを目的としていることに注意してください。私はを使用していKeycloak 8.0.0ます。
パートI
始める前のいくつかの用語: 
- Keycloakでは、次の2種類の権限を作成できます。リソースベースとスコープ。
- 簡単に言えば、 Resource-Based権限については、リソースに直接適用します
- 以下のためScoped-Basedの許可は、あなたのスコープ(複数可)または範囲(複数可)に適用し、リソース。
  1つの「ビュー」スコープを作成し、それを複数のリソース(アカウント、トランザクションなど)で使用することをお勧めしますか?または、「viewAccount」スコープ、「viewTransaction」スコープなどを作成する必要がありますか?
スコープは、保護されたリソースでの一連の権限を表します。あなたの場合、2つのリソースがあります。accountとtransaction、なので、2番目のアプローチに傾倒します。
長期的には、グローバルたview(すべてのリソースに関連付けられている範囲を例えばaccount、transaction、customer、settlement...)の両方に困難な許可が管理し、セキュリティ要件の変化に適応することができます。
デザインの感触をつかむためにチェックアウトできるいくつかの例を次に示します。
ただし、注意してください-リソース間でスコープを共有するべきではないと主張しているわけではありません。実際のところ、Keycloak同じリソースに対してこれを許可しますtype。たとえば、viewAccountとviewTransaction、特定のアカウントでトランザクションを読み取るには、スコープのが必要になる可能性があります(結局、トランザクションを表示するには、アカウントにアクセスする必要があるかもしれません)。要件と標準は、設計に大きく影響します。
  リソースとスコープの実際的な組み合わせごとに、権限を作成するのが通常の方法ですか?
申し訳ありませんが、私は質問を完全に理解していないので、少し広範になります。へのアクセスを許可/拒否するにはresource、次のことを行う必要があります。
- ポリシーを定義する 
- あなたの定義 権限を
- ポリシーを権限に適用する
- 権限をscopeまたはresource(または両方)に関連付けます
ポリシーの施行を有効にするため。承認プロセスを参照してください。
これらすべてをどのように設定するかは、完全にあなた次第です。たとえば、次のことができます。
- 個々のポリシーを定義し、適切な許可の下で各ポリシーを結び付けます。 
- さらに良いことに、個々のポリシーを定義してから、関連するすべてのポリシーを- aggregatedポリシー(ポリシーのポリシー)の下にグループ化し、その集約されたポリシーを- scope-basedアクセス許可に関連付けます。あなたはそれを持つことができます- scoped-based権限をリソースとそれに関連するすべてのスコープの両方に適用するます。
 
- または、2つの別々のタイプを活用して、権限をさらに分解することもできます。- resource-based権限タイプを介してリソースに対してのみ権限を作成し、他の権限を- scope-based権限タイプを介してスコープのみに個別に関連付けることができます。
 
オプションがあります。  
  特定のリソース/スコープに一致する複数のアクセス許可がある場合、Keycloakは何をしますか? 
これは 
- リソースサーバーの  Decision Strategy
- 各許可の Decision Strategy
- 各ポリシーのLogic値。
Logic値は、Javaのと似ている!事業者。PositiveまたはのいずれかNegativeです。ときLogicでPositive、政策の最終的な評価は変わりません。そのNegative場合、最終結果は否定されます(たとえば、ポリシーがfalseと評価され、それLogicがNegativeである場合、それは否定されますtrue)。物事を単純にするために、Logicが常にに設定されていると仮定しましょうPositive。
それDecision Strategyが私たちが本当に取り組みたいことです。はまたDecision StrategyはのいずれUnanimousかAffirmativeです。ドキュメントから、
  意思決定戦略
  
  この構成により、評価されたすべてのアクセス許可の結果に基づいて、リソースまたはスコープを付与するかどうかをポリシー評価エンジンが決定する方法が変更されます。肯定的とは、リソースとそのスコープへのアクセスを許可するために、少なくとも1つの許可が肯定的な決定に評価される必要があることを意味します。全会一致とは、最終決定も肯定的であるためには、すべての許可が肯定的決定に評価される必要があることを意味します。例として、同じリソースまたはスコープに対する2つのアクセス許可が競合している場合(一方がアクセスを許可し、もう一方がアクセスを拒否している)、選択した戦略が肯定的であれば、リソースまたはスコープへのアクセス許可が付与されます。それ以外の場合、アクセス許可を1回拒否すると、リソースまたはスコープへのアクセスも拒否されます。
上記をよりよく理解するために例を使用してみましょう。2つの権限を持つリソースがあり、誰かがそのリソースにアクセスしようとしているとします(これLogicはPositiveすべてのポリシーに適用されます)。今:
- Permission Oneに- Decision Strategy設定されてい- Affirmativeます。また、それぞれが評価する3つのポリシーがあります。
ポリシーの1つがに設定されているためtrue、Permission Oneはに設定されますtrue(肯定的-1つだけが必要ですtrue)。
- Permission Two持っている- Decision Strategyにセットを- Unanimous2つのポリシーを持ちます:
この場合Permission Twoはfalse、1つのポリシーが偽であるためです(全会一致-すべてが偽である必要がありますtrue)。
- これで最終評価が行われます。リソースサーバーDecision Strategyがに設定されている場合、はであるためAffirmative、そのリソースへのアクセスが許可されPermission Oneますtrue。一方、リソースサーバーDecision Strategyがに設定されているUnanimous場合、アクセスは拒否されます。
見る: 
これを再検討し続けます。Decision Strategy  パートIIでリソースサーバーを設定する方法を説明します。
  たとえば、「アカウント」にアクセスする権限と「表示」スコープの権限を持つことができるので、アカウントを表示する権限がありますか? 
簡単な答えはイエスです。さて、これを少し拡張してみましょう:)
次のシナリオがある場合: 
- リソースサーバーのDecision Strategy設定UnanimousまたはAffirmative
- account/{id}リソースにアクセスするための権限は- true
- viewスコープにアクセスする権限は- true
アカウントを表示するためのアクセス権が付与されます。 
- true+- trueに等しい- true下- Affirmativeまたは- Unanimous- Decision Strategy。
今あなたがこれを持っているなら 
- リソースサーバーのDecision Strategy設定Affirmative
- account/{id}リソースにアクセスするための権限は- true
- viewスコープにアクセスする権限は- false
あなたはしますも、アカウントを表示するためのアクセスを許可すること。
- true+- falseは戦略の- true下にあり- Affirmativeます。
ここでのポイントは、特定のリソースへのアクセスもセットアップに依存するため、2番目のシナリオが必要ない場合があるので注意してください。 
  しかし、これは、ユーザーが属することができるレガシーグループごとにポリシーが必要であることを意味するのは正しいですか?  
Keycloakが2年前にどのように動作したかはわかりませんが、グループベースのポリシーを指定して、そのポリシーの下にすべてのグループを追加するだけで済みます。確かに、グループごとに1つのポリシーを作成する必要はありません。
  たとえば、「ヘルプデスク」ロールがある場合は、「ヘルプデスクメンバーシップ」ポリシーが必要です。これを「viewAccount」権限に追加できます。これは正しいです?
かなり。これを設定する方法はたくさんあります。たとえば、次のことができます。
- リソース(例/account/{id})を作成し、account:viewスコープに関連付けます。
- 役割ベースのポリシーを作成し、helpdeskそのポリシーの下に役割を追加します
- 作成Scope-Basedと呼ばれる許可をviewAccountしてとそれを結ぶscope、resourceとpolicy
パートIIでも同様の設定を行います。 
パートII
Keycloakには、すべてのポリシーをテストできる小さなツールがあります。さらに良いことに、これを機能させるために、実際には別のアプリケーションサーバーを起動して別のアプリをデプロイする必要はありません。  
設定するシナリオは次のとおりです。 
- と呼ばれる新しいレルムを作成します stackoverflow-demo
- bank-apiその領域の下にクライアントを作成します
- /account/{id}そのクライアントに呼び出されるリソースを定義します
- account/{id}必要があります- account:viewスコープを
- bob新しいレルムの下に呼び出されるユーザーを作成します
- 我々はまた、3つの役割を作成します:bank_teller、account_ownerおよびuser
- 私たちはbobいかなる役割にも関連付けません。これは今は必要ありません。
 
- 次の2つのRole-Basedポリシーを設定します。
- bank_tellerと- account_ownerにアクセスしてい- /account/{id}たリソースを
- account_owner- account:viewスコープにアクセスできます
- userリソースまたはスコープにアクセスできません
 
- 私たちはで遊んでよEvaluate、アクセスが許可または拒否することができます方法を確認するためのツール。
私を許してください、この例は非現実的ですが、私は銀行セクターに精通していません:) 
Keycloakのセットアップ
Keycloakをダウンロードして実行します
cd tmp
wget https://downloads.jboss.org/keycloak/8.0.0/keycloak-8.0.0.zip 
unzip keycloak-8.0.0.zip
cd keycloak-8.0.0/bin
./standalone.sh 
初期管理者ユーザーを作成する
- に移動 http://localhost:8080/auth
- Administration Consoleリンクをクリックしてください
- 管理者ユーザーを作成してログインします 
詳細については、「はじめに」をご覧ください。私たちの目的では、上記で十分です。
ステージのセットアップ
新しいレルムを作成する
- masterレルムの周りにマウスを置き、- Add Realmボタンをクリックします。
- stackoverflow-demo名前として入力します。
- をクリックしCreateます。
- 左上にレルムのstackoverflow-demo代わりに言う必要がありmasterます。
新しいレルムの作成を参照してください 
新しいユーザーを作成する
- Users左側のリンクをクリックしてください
- クリックしてAdd User、ボタン
- username(例- bob)を入力します
- User Enabledオンになっていることを確認します
- クリック Save
新しいユーザーの作成を参照してください
新しい役割を作成する
- Rolesリンクをクリックしてください
- クリック Add Role
- 次の役割を追加しますbank_teller、account_ownerとuser
繰り返しますが、ユーザーをロールに関連付けないでください。私たちの目的では、これは必要ありません。
役割を参照してください
クライアントを作成する
- Clientsリンクをクリックしてください
- クリック Create
- に入力bank-apiしてくださいClient ID
- 以下のためのRoot URL入力http://127.0.0.1:8080/bank-api
- クリック Save
- それClient Protocolがopenid-connect
- に変更Access Typeしますconfidential
- 変更Authorization EnabledへOn
- 下にスクロールして、を押しSaveます。新しいAuthorizationタブが上部に表示されます。
- Authorizationタブをクリックしてから- Settings
- Decision Strategyがに設定されていることを確認します- Unanimous- 
- これはリソースサーバーの Decision Strategy
 
見る:
カスタムスコープを作成する
- Authorizationタブをクリックします
- Authorization Scopes>- Createをクリックして- Add Scopeページを表示します
- account:view名前を入力してEnterキーを押します。
「アカウントリソースの表示」を作成する
- 上のAuthorizationリンクをクリックしてください
- クリック Resources
- クリック Create
- 入力View Account Resourceの両方のためにNameとDisplay name
- に入力account/{id}してくださいURI
- テキストボックスに入力account:viewしますScopes
- クリック Save
リソースの作成を参照してください
ポリシーを作成する
- 再びAuthorizationタブの下で、をクリックしますPolicies
- ドロップダウンRoleから選択しますCreate Policy
- ではNameセクション、タイプOnly Bank Teller and Account Owner Policy
- 下のRealm Roles選択の両方bank_tellerとaccount_owner役割
- Logicがに設定されていることを確認します- Positive
- クリック Save
- Policiesリンクをクリックしてください
- ドロップダウンRoleからもう一度選択しCreate Policyます。
- 今回Only Account Owner PolicyはName
- 下のRealm Roles選択account_owner
- Logicがに設定されていることを確認します- Positive
- クリック Save
- Policies上部のリンクをクリックすると、新しく作成したポリシーが表示されます。
ロールベースのポリシーを参照してください 
Keycloakにははるかに強力なポリシーがあることに注意してください。ポリシーの管理を参照してください
リソースベースの権限を作成する
- 再びAuthorizationタブの下で、をクリックしますPermissions
- 選択する Resource-Based
- タイプView Account Resource PermissionについてName
- Resourcesタイプの下- View Account Resource Permission
- 下のApply Policy選択Only Bank Teller and Account Owner Policy
- Decision Strategyがに設定されていることを確認します- Unanimous
- クリック Save
リソースベースの権限の作成を参照してください 
ふぅ... 
リソースベースの権限の評価
- 再びAuthorizationタブの下で、Evaluate
- User入力の下で- bob
- 下のRoles選択user
- 以下の下でResources選択View Account Resourceし、クリックAdd
- [評価]をクリックします。 
- 展開View Account Resource with scopes [account:view]の結果を見て、あなたが表示されるはずですDENY。

- これは、を介してそのリソースへのアクセスを2つのロールにのみ許可するため意味がありOnly Bank Teller and Account Owner Policyます。これをテストして、これが正しいことを確認しましょう!
- Back評価結果の真上にあるリンクをクリックしてください
- bobの役割をに変更しaccount_owner、をクリックしEvaluateます。結果はとして表示されPERMITます。戻って役割をに変更した場合も同じ取引bank_teller
ポリシーの評価とテストを参照してください
スコープベースの権限を作成する
- Permissionsセクションに戻る
- ドロップダウンでScope-Based今回を選択しCreate Permissionます。
- 下にName、View Account Scope Permission
- 下にScopes、account:view
- 下にApply Policy、Only Account Owner Policy
- Decision Strategyがに設定されていることを確認します- Unanimous
- クリック Save
スコープベースの権限の作成を参照してください 
2回目のテスト実行 
新しい変更の評価
- Authorizationセクションに戻る
- クリック Evaluate
- ユーザーは bob
- 役割は bank_teller
- リソースはView Account Resource、クリックする必要がありますAdd
- をクリックするEvaluateと、が表示されますDENY。
- 繰り返しbank_tellerますが、resourceこれはにアクセスできますが、にはアクセスできないので、当然のことscopeです。ここでは、一方の権限がtrueと評価され、もう一方の権限がfalseと評価されます。リソースサーバーDecision Strategyがに設定されているUnanimous場合、最終的な決定はDENYです。
 
- タブのSettings下をクリックしAuthorization、をに変更しDecision StrategyてAffirmative、手順1〜6に戻ります。今回は、最終結果は次のようになりますPERMIT(1つの許可が真であるため、最終決定が真です)。
- 完全を期すために、リソースサーバーをにDecision Strategy戻しますUnanimous。繰り返しますが、手順1〜6に戻りますが、今回は役割をとして設定しaccount_ownerます。今回も、との両方にアクセスできることをPERMIT考えると、最終結果は理にかなってaccount_ownerいます。resourcescope
きちんとした:)これが役立つことを願っています。