Ressourcen, Bereiche, Berechtigungen und Richtlinien in Keycloak

81

Ich möchte ein ziemlich einfaches rollenbasiertes Zugriffskontrollsystem mit dem Autorisierungssystem von Keycloak erstellen. Das System, das Keycloak ersetzt, ermöglicht es uns, einen "Benutzer" zu erstellen, der Mitglied einer oder mehrerer "Gruppen" ist. In diesem Legacy-System erhält ein Benutzer die "Berechtigung", auf jede der etwa 250 "Funktionen" zuzugreifen, entweder durch Gruppenmitgliedschaft (bei der Gruppen Berechtigungen zugewiesen werden) oder durch direkte Erteilung einer Berechtigung an den Benutzer.

Ich möchte das Legacy-System Keycloak-Berechtigungen zuordnen.

Es sollte für mich einfach sein, jede "Fähigkeit" im vorhandenen System einer Schlüsselumhüllungsressource und einer Reihe von Schlüsselumhüllungsbereichen zuzuordnen. Beispielsweise würde eine "viewAccount" -Funktion offensichtlich einer "Konto" -Ressource und einem "Ansicht" -Bereich zugeordnet. und "viewTransaction" werden einer "Transaktions" -Ressource zugeordnet. Ist es jedoch empfehlenswert, nur einen "Ansicht" -Bereich zu erstellen und ihn für mehrere Ressourcen (Konto, Transaktion usw.) zu verwenden? Oder sollte ich einen Bereich "viewAccount", einen Bereich "viewTransaction" usw. erstellen?

Ebenso bin ich etwas verwirrt über Berechtigungen. Ist es üblich, für jede praktische Kombination aus Ressource und Umfang eine Berechtigung zu erstellen? Was macht Keycloak, wenn mehrere Berechtigungen für eine bestimmte Ressource / einen bestimmten Bereich vorhanden sind? Ich vermute, dass Keycloak es mir ermöglichen soll, eine Matrix von Berechtigungen für Ressourcen und Bereiche zu konfigurieren, sodass ich beispielsweise die Berechtigung zum Zugriff auf "Konten" und die Berechtigung zum "Anzeigen" des Bereichs haben könnte, sodass ich die Berechtigung hätte Konten anzeigen?

Ich frage, weil das Ergebnis all dessen zu sein scheint, dass meine alte "viewAccount" -Funktion dazu führt, dass eine "Account" -Ressource mit dem Bereich "View" und einer "viewAccount" -Berechtigung erstellt wird, die mich wieder dorthin zu bringen scheint, wo ich war. Welches ist in Ordnung, wenn es richtig ist.

Schließlich benötige ich natürlich eine Reihe von Richtlinien, die festlegen, ob viewAccount angewendet werden soll. Aber habe ich Recht, dass dies bedeutet, dass ich eine Richtlinie für jede der Legacy-Gruppen benötige, zu denen ein Benutzer gehören könnte? Wenn ich beispielsweise eine "Helpdesk" -Rolle habe, benötige ich eine "Helpdesk-Mitgliedschafts" -Richtlinie, die ich dann zur Berechtigung "viewAccount" hinzufügen kann. Ist das richtig?

Vielen Dank,

Kennzeichen

Doktor Eval
quelle
25
Keycloak sieht aus wie ein ziemlich ausgereiftes und sehr leistungsfähiges System, aber was es wirklich kann, bleibt ein Rätsel, da es so viele Fragen und so wenig Antworten zu geben scheint. Ich stelle mir buchstäblich alle Fragen in Ihrem Beitrag und kann keine Antworten finden. Warum gibt es da draußen keine guten Tutorials? Benutzt niemand dieses Zeug wirklich? Oder macht sich niemand die Mühe, darüber zu schreiben?
Stijn de Witt
3
Keycloak arbeitet (bisher) hervorragend für uns in der Produktion, mit Ausnahme der Autorisierung, die sich nur schwer auf meine tatsächlichen Probleme beziehen lässt. Aber ich stimme zu, es gibt viele Dokumentationen darüber, wie Keycloak OIDC macht, aber auch die allgegenwärtige Annahme, dass wir OAuth und OIDC kennen. Es ist schwierig, Keycloak mit Anwendungsproblemen in Verbindung zu bringen, wenn Sie OIDC noch nicht kennen, aber für mich war Keycloak die Einführung in OIDC, was ein kleiner Haken 22 ist. (Picketlink / Picketbox war noch schlimmer!). Ich fand es am besten, es herunterzuladen und einfach damit zu spielen.
Doktor Eval
6
Ich stimme diesen Kommentaren zu, die Dokumentation des Schlüsselmantels und die Anwendungsfälle sind zum Kotzen
Olivier Refalo
20
Keycloak-Entwickler, nehmen Sie diese Frage zur Kenntnis! Ihre Dokumentation ist ziemlich gut, benötigt jedoch weitere Tutorials, um die hier aufgeworfenen Fragen zu beantworten. Sie können auch in Betracht ziehen, von der Mailingliste der alten Schule zu etwas Benutzerfreundlicherem wie einem Forum oder einfach nur Stackoverflow zu migrieren.
GGGforce
5
Späte Antwort, aber alle Ihre Annahmen sind grundsätzlich richtig. Was die beste Vorgehensweise ist, ist meiner Meinung nach schwer zu sagen, da die Funktionen sehr neu sind. Ich bin mir nicht sicher, ob selbst kc-Entwickler zu diesem Zeitpunkt wissen, welche Best Practices es gibt.
cen

Antworten:

119

Ich weiß, dass ich 2+ Jahre zu spät bin, aber ich denke, ich würde teilen, was ich weiß, und hoffentlich einige Schmerzen für zukünftige Leser lindern. Volle Transparenz - Ich bin kein Keycloak / OAuth / OIDC-Experte und was ich weiß, ist hauptsächlich das Lesen der Dokumente, Bücher, des guten alten YouTube und das Herumspielen mit dem Tool.

Dieser Beitrag besteht aus zwei Teilen:

  1. Ich werde versuchen, alle Ihre Fragen nach besten Kräften zu beantworten
  2. Ich zeige Ihnen alles, wie Sie mit Richtlinien / Bereichen / Berechtigungen in Keycloak herumspielen können, ohne eine separate App bereitstellen zu müssen, um einige der Kernkonzepte in diesem Thread besser zu verstehen. Beachten Sie jedoch, dass dies hauptsächlich dazu gedacht ist, Ihnen den Einstieg zu erleichtern. Ich benutze Keycloak 8.0.0.

Teil I.

Einige Begriffe, bevor wir beginnen:

  • In Keycloak können Sie zwei Arten von Berechtigungen erstellen: ressourcenbasiert und bereichsbasiert .
  • Einfach ausgedrückt, für Resource-BasedBerechtigungen wenden Sie es direkt auf Ihre Ressource an
  • Um eine Scoped-BasedBerechtigung zu erhalten, wenden Sie sie auf Ihre Bereiche oder Bereiche und Ressourcen an.

Ist es empfehlenswert, nur einen "Ansichts" -Bereich zu erstellen und ihn für mehrere Ressourcen (Konto, Transaktion usw.) zu verwenden? Oder sollte ich einen Bereich "viewAccount", einen Bereich "viewTransaction" usw. erstellen?

Bereiche repräsentieren eine Reihe von Rechten an einer geschützten Ressource. In Ihrem Fall haben Sie zwei Ressourcen: accountund transaction, so würde ich mich zum zweiten Ansatz neigen.

Auf langer Sicht, einen globalen mit viewUmfang mit allen Ressourcen verbunden ist (zB account, transaction, customer, settlement...) macht Genehmigung schwierig, sowohl verwalten und Sicherheitsanforderungen Änderungen anzupassen.

Hier sind einige Beispiele, die Sie sich ansehen können, um ein Gefühl für Design zu bekommen

Beachten Sie jedoch, dass ich nicht behaupte, dass Sie Bereiche nicht ressourcenübergreifend teilen sollten. Tatsache ist, Keycloakermöglicht dies für Ressourcen mit den gleichen type. Sie könnten beispielsweise beides viewAccountund den viewTransactionUmfang benötigen , um eine Transaktion unter einem bestimmten Konto zu lesen (schließlich benötigen Sie möglicherweise Zugriff auf das Konto, um Transaktionen anzuzeigen). Ihre Anforderungen und Standards werden Ihr Design stark beeinflussen.

Ist es üblich, für jede praktische Kombination aus Ressource und Umfang eine Berechtigung zu erstellen?

Entschuldigung, ich verstehe die Frage nicht ganz, also werde ich ein bisschen breit sein. Um den Zugriff auf a zu gewähren / zu verweigern resource, müssen Sie:

  • Definieren Sie Ihre Richtlinien
  • Definieren Sie Ihre Berechtigungen
  • Wenden Sie Ihre Richtlinien auf Ihre Berechtigungen an
  • Verknüpfen Sie Ihre Berechtigungen mit einem scopeoder resource(oder beiden)

damit die Durchsetzung der Richtlinien wirksam wird. Siehe Autorisierungsprozess .

Wie Sie das alles einrichten, liegt ganz bei Ihnen. Sie könnten zum Beispiel:

  • Definieren Sie einzelne Richtlinien und binden Sie jede Richtlinie mit der entsprechenden Berechtigung.

  • Besser noch, definieren Sie einzelne Richtlinien, gruppieren Sie dann alle zugehörigen Richtlinien unter einer aggregatedRichtlinie (einer Richtlinienrichtlinie) und ordnen Sie diese aggregierte Richtlinie der scope-basedBerechtigung zu. Diese scoped-basedBerechtigung kann sowohl für die Ressource als auch für den gesamten zugehörigen Bereich gelten.

  • Sie können Ihre Berechtigungen auch weiter aufteilen, indem Sie die beiden separaten Typen nutzen. Sie können Berechtigungen ausschließlich für Ihre Ressourcen über den resource-basedBerechtigungstyp erstellen und andere Berechtigungen separat ausschließlich einem Bereich über den scope-basedBerechtigungstyp zuordnen.

Sie haben Optionen.

Was macht Keycloak, wenn mehrere Berechtigungen für eine bestimmte Ressource / einen bestimmten Bereich vorhanden sind?

Das hängt davon ab

  1. Der Ressourcenserver Decision Strategy
  2. Jede Erlaubnis ist Decision Strategy
  3. LogicWert jeder Richtlinie .

Der LogicWert ist ähnlich wie beim Java- !Operator. Es kann entweder sein Positiveoder Negative. Wenn dies der Fall Logicist Positive, bleibt die endgültige Bewertung der Richtlinie unverändert. Wenn dies der Fall ist , wird Negativedas Endergebnis negiert (z. B. wenn eine Richtlinie als falsch bewertet Logicwird Negativeund dies der Fall ist , ist dies der Fall true). Nehmen wir zur Vereinfachung an, dass der Wert Logicimmer auf eingestellt ist Positive.

Das Decision Strategyist es, was wir wirklich angehen wollen. Das Decision Strategykann entweder sein Unanimousoder Affirmative. Aus den Dokumenten,

Entscheidungsstrategie

Diese Konfiguration ändert die Art und Weise, wie das Richtlinienbewertungsmodul basierend auf dem Ergebnis aller bewerteten Berechtigungen entscheidet, ob eine Ressource oder ein Bereich gewährt werden soll oder nicht. Bejahend bedeutet, dass mindestens eine Berechtigung eine positive Entscheidung treffen muss, um Zugriff auf eine Ressource und ihre Bereiche zu gewähren. Einstimmig bedeutet, dass alle Berechtigungen eine positive Entscheidung treffen müssen, damit die endgültige Entscheidung auch positiv ist. Wenn beispielsweise zwei Berechtigungen für dieselbe Ressource oder denselben Bereich in Konflikt stehen (eine gewährt den Zugriff und die andere verweigert den Zugriff), wird die Berechtigung für die Ressource oder den Bereich erteilt, wenn die ausgewählte Strategie "Bestätigend" lautet. Andernfalls verweigert eine einzelne Verweigerung einer Berechtigung auch den Zugriff auf die Ressource oder den Bereich.

Verwenden wir ein Beispiel, um das Obige besser zu verstehen. Angenommen , Sie eine Ressource mit 2 Berechtigungen und jemand versucht , den Zugriff auf die Ressource (denken Sie daran, das Logicist Positivefür alle Richtlinien). Jetzt:

  1. Permission Onehat einen Decision StrategySatz zu Affirmative. Es gibt auch drei Richtlinien, in denen jeweils Folgendes bewertet wird:
    • true
    • false
    • false

Da eine der Richtlinien auf gesetzt ist true, Permission Oneist auf gesetzt true(bejahend - nur 1 muss sein true).

  1. Permission Twohat einen Decision StrategySatz Unanimousmit 2 Richtlinien:
    • true
    • false

In diesem Fall Permission Twoist falseeine Richtlinie falsch (einstimmig - sie müssen alle sein true).

  1. Nun kommt die endgültige Bewertung. Wenn der Ressource - Server Decision Strategygesetzt ist Affirmative, den Zugang zu dieser Ressource gewährt werden würde , da Permission Oneist true. Wenn andererseits der Ressourcenserver auf Decision Strategyeingestellt ist, Unanimouswird der Zugriff verweigert.

Sehen:

Wir werden das noch einmal überdenken. Ich erkläre Decision Strategy in Teil II , wie die Ressourcen-Server eingestellt werden .

So könnte ich beispielsweise die Berechtigung zum Zugriff auf "Konten" und die Berechtigung zum Anzeigen des Bereichs "Anzeigen" haben. Daher hätte ich die Berechtigung zum Anzeigen von Konten?

Die kurze Antwort lautet ja. Lassen Sie uns das jetzt etwas erweitern :)

Wenn Sie das folgende Szenario haben:

  1. Der Ressourcenserver ist Decision Strategyauf Unanimousoder eingestelltAffirmative
  2. Die Berechtigung zum Zugriff auf die account/{id}Ressource isttrue
  3. Die Berechtigung zum Zugriff auf den viewBereich isttrue

Sie erhalten Zugriff auf das Konto.

  • true+ trueist gleich trueunter dem Affirmativeoder Unanimous Decision Strategy.

Nun, wenn Sie das haben

  1. Ressourcenserver ist auf Decision StrategyeingestelltAffirmative
  2. Die Berechtigung zum Zugriff auf die account/{id}Ressource isttrue
  3. Die Berechtigung zum Zugriff auf den viewBereich istfalse

Sie erhalten außerdem Zugriff auf das Konto.

  • true+ falsesteht trueunter der AffirmativeStrategie.

Der Punkt hier ist, dass der Zugriff auf eine bestimmte Ressource auch von Ihrem Setup abhängt. Seien Sie also vorsichtig, da Sie das zweite Szenario möglicherweise nicht möchten.

Aber habe ich Recht, dass dies bedeutet, dass ich eine Richtlinie für jede der Legacy-Gruppen benötige, zu denen ein Benutzer gehören könnte?

Ich bin nicht sicher , wie Keycloak vor 2 Jahren verhalten haben , aber Sie können angeben Gruppenbasierte Politik und einfach alle Ihre Gruppen im Rahmen dieser Politik hinzuzufügen. Sie müssen sicherlich keine Richtlinie pro Gruppe erstellen.

Wenn ich beispielsweise eine "Helpdesk" -Rolle habe, benötige ich eine "Helpdesk-Mitgliedschafts" -Richtlinie, die ich dann zur Berechtigung "viewAccount" hinzufügen kann. Ist das richtig?

Ja schon. Es gibt viele Möglichkeiten, wie Sie dies einrichten können. Zum Beispiel können Sie:

  1. Erstellen Sie Ihre Ressource (z. B. /account/{id}) und ordnen Sie sie dem account:viewBereich zu.
  2. Erstellen Sie eine rollenbasierte Richtlinie und fügen Sie die helpdeskRolle unter dieser Richtlinie hinzu
  3. Erstellen Sie eine Scope-BasedBerechtigung namens viewAccountund verknüpfen Sie sie mit scope, resourceundpolicy

Wir werden in Teil II etwas Ähnliches einrichten.

Teil II

Keycloak hat ein hübsches kleines Tool, mit dem Sie alle Ihre Richtlinien testen können. Besser noch, Sie müssen tatsächlich keinen anderen Anwendungsserver hochfahren und eine separate App bereitstellen, damit dies funktioniert.

Hier ist das Szenario, das wir einrichten werden:

  1. Wir werden ein neues Reich namens erstellen stackoverflow-demo
  2. In bank-apidiesem Bereich erstellen wir einen Client
  3. Wir werden eine Ressource definieren, die /account/{id}für diesen Client aufgerufen wird
  4. Das account/{id}wird den account:viewUmfang haben
  5. Wir erstellen einen Benutzer, der bobunter dem neuen Bereich aufgerufen wird
  6. Wir werden nun auch drei Rollen: bank_teller, account_ownerunduser
    • Wir werden bobkeine Rollen zuordnen. Dies wird derzeit nicht benötigt.
  7. Wir werden die folgenden zwei Role-BasedRichtlinien einrichten :
    • bank_tellerund account_ownerhaben Zugriff auf die /account/{id}Ressource
    • account_ownerhat Zugriff auf den account:viewBereich
    • user hat keinen Zugriff auf die Ressource oder den Bereich
  8. Wir werden mit dem EvaluateTool herumspielen, um zu sehen, wie der Zugriff gewährt oder verweigert werden kann.

Verzeihen Sie mir, dieses Beispiel ist unrealistisch, aber ich kenne den Bankensektor nicht :)

Keycloak-Setup

Laden Sie Keycloak herunter und führen Sie es aus

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 

Erstellen Sie den ersten Administrator

  1. Gehe zu http://localhost:8080/auth
  2. Klicken Sie auf den Administration ConsoleLink
  3. Erstellen Sie den Administrator und melden Sie sich an

Weitere Informationen finden Sie unter Erste Schritte . Für unsere Zwecke ist das oben Genannte ausreichend.

Bühne einrichten

Erstelle ein neues Reich

  1. Bewegen Sie die Maus über das masterReich und klicken Sie auf die Add RealmSchaltfläche.
  2. Geben Sie stackoverflow-demoals Namen ein.
  3. Klicken Sie auf Create.
  4. Oben links sollte jetzt stackoverflow-demostatt des masterReiches stehen.

Siehe Erstellen eines neuen Bereichs

Erstellen Sie einen neuen Benutzer

  1. Klicken Sie auf den UsersLink links
  2. Klicken Sie auf die Add UserSchaltfläche
  3. Geben Sie die username(zB bob)
  4. Stellen Sie sicher, dass eingeschaltet User Enabledist
  5. Klicken Save

Siehe Erstellen eines neuen Benutzers

Erstellen Sie neue Rollen

  1. Klicken Sie auf den RolesLink
  2. Klicke auf Add Role
  3. Fügen Sie die folgenden Rollen: bank_teller, account_ownerunduser

Auch hier kann nicht assoziieren Ihre Benutzer mit den Rollen. Für unsere Zwecke wird dies nicht benötigt.

Siehe Rollen

Erstellen Sie einen Client

  1. Klicken Sie auf den ClientsLink
  2. Klicke auf Create
  3. Geben Sie bank-apifür dieClient ID
  4. Für die Root URLEingabehttp://127.0.0.1:8080/bank-api
  5. Klicke auf Save
  6. Stellen Sie sicher , dass Client Protocolistopenid-connect
  7. Ändern Sie das Access Typeinconfidential
  8. Wechseln Sie Authorization EnabledzuOn
  9. Scrollen Sie nach unten und drücken Sie Save. AuthorizationOben sollte eine neue Registerkarte angezeigt werden.
  10. Klicken Sie auf die AuthorizationRegisterkarte und dannSettings
  11. Stellen Sie sicher, dass das auf eingestellt Decision StrategyistUnanimous
    • Dies ist der Ressourcenserver Decision Strategy

Sehen:

Erstellen Sie benutzerdefinierte Bereiche

  1. Klicken Sie auf die AuthorizationRegisterkarte
  2. Klicken Sie auf Authorization Scopes> Create, um die Add ScopeSeite aufzurufen
  3. Geben Sie account:viewden Namen ein und drücken Sie die Eingabetaste.

Erstellen Sie "Kontoressource anzeigen"

  1. Klicken Sie oben auf den AuthorizationLink
  2. Klicke auf Resources
  3. Klicke auf Create
  4. Geben Sie View Account Resourcesowohl für Nameals auch einDisplay name
  5. Geben Sie account/{id}für dieURI
  6. Geben Sie account:viewin das ScopesTextfeld ein
  7. Klicken Save

Siehe Erstellen von Ressourcen

Erstellen Sie Ihre Richtlinien

  1. AuthorizationKlicken Sie erneut unter der Registerkarte aufPolicies
  2. Wählen Role aus der Create PolicyDropdown-Liste
  3. Geben Sie im NameAbschnitt Folgendes einOnly Bank Teller and Account Owner Policy
  4. Wählen Realm RolesSie unter bank_tellerund ausaccount_owner Rolle
  5. Stellen Sie sicher, dass eingestellt LogicistPositive
  6. Klicken Save
  7. Klick auf das PoliciesLink
  8. Wählen Sie Roleerneut ausCreate Policy Dropdown-Liste.
  9. Diesmal Only Account Owner Policyfür dieName
  10. Klicken Realm RolesSie unter Auswählenaccount_owner
  11. Stellen Sie sicher, dass eingestellt LogicistPositive
  12. Klicken Save
  13. Klicken Sie oben auf den PoliciesLink. Sie sollten nun Ihre neu erstellten Richtlinien sehen.

Siehe Rollenbasierte Richtlinie

Beachten Sie, dass Keycloak viel leistungsfähigere Richtlinien hat. Siehe Verwalten von Richtlinien

Erstellen Sie eine ressourcenbasierte Berechtigung

  1. AuthorizationKlicken Sie erneut unter der Registerkarte aufPermissions
  2. Wählen Resource-Based
  3. Geben Sie View Account Resource Permissionfür dieName
  4. Unter ResourcesTypView Account Resource Permission
  5. Klicken Apply PolicySie unter AuswählenOnly Bank Teller and Account Owner Policy
  6. Stellen Sie sicher, dass das auf eingestellt Decision StrategyistUnanimous
  7. Klicken Save

Siehe Erstellen von ressourcenbasierten Berechtigungen

Puh...

Auswerten der ressourcenbasierten Berechtigung

  1. Wählen Sie erneut unter der AuthorizationRegisterkarte ausEvaluate
  2. Unter Userenterbob
  3. Klicken RolesSie unter Auswählenuser
    • Hier ordnen wir unseren Benutzer unseren erstellten Rollen zu.
  4. Klicken Sie unter ResourcesAuswählen View Account Resourceund klicken Sie aufAdd
  5. Klicken Sie auf Auswerten.
  6. Erweitern Sie die View Account Resource with scopes [account:view], um die Ergebnisse anzuzeigen , und Sie sollten sehen DENY.

Geben Sie hier die Bildbeschreibung ein

  1. Dies ist sinnvoll, da wir nur zwei Rollen den Zugriff auf diese Ressource über das zulassen Only Bank Teller and Account Owner Policy . Testen wir dies, um sicherzustellen, dass dies wahr ist!
  2. Klick auf das Back Link direkt über dem Bewertungsergebnis
  3. Ändern Sie die Rolle von Bob in account_ownerund klicken Sie auf Evaluate. Sie sollten das Ergebnis nun als sehen PERMIT. Gleiches Angebot, wenn Sie zurückgehen und die Rolle in ändernbank_teller

Siehe Auswerten und Testen von Richtlinien

Erstellen Sie eine bereichsbezogene Berechtigung

  1. Gehen Sie zurück zum PermissionsAbschnitt
  2. Wählen Sie Scope-Baseddiese Zeit in der Create PermissionDropdown-Liste aus.
  3. Geben Sie Nameunter einView Account Scope Permission
  4. Geben Sie Scopesunter einaccount:view
  5. Geben Sie Apply Policyunter einOnly Account Owner Policy
  6. Stellen Sie sicher, dass das auf eingestellt Decision StrategyistUnanimous
  7. Klicken Save

Siehe Erstellen bereichsbasierter Berechtigungen

Zweiter Testlauf

Bewertung unserer neuen Änderungen

  1. Gehen Sie zurück zum AuthorizationAbschnitt
  2. Klicke auf Evaluate
  3. Benutzer sollte sein bob
  4. Rollen sollten sein bank_teller
  5. Ressourcen sollten sein View Account Resourceund klickenAdd
  6. Klicken Sie auf Evaluateund wir sollten bekommen DENY.
    • Auch dies sollte nicht überraschen, da der bank_tellerZugang zum, resourceaber nicht zum hat scope. Hier wird eine Berechtigung als wahr und die andere als falsch ausgewertet. Da der Ressourcenserver auf Decision Strategyeingestellt ist, Unanimousist die endgültige Entscheidung DENY.
  7. Klicken Sie Settingsunter der AuthorizationRegisterkarte auf und ändern Sie das Decision Strategyzu Affirmativeund kehren Sie erneut zu den Schritten 1-6 zurück. Dieses Mal sollte das Endergebnis sein PERMIT(eine Erlaubnis ist wahr, also ist die endgültige Entscheidung wahr).
  8. Wenden Sie der Vollständigkeit halber den Ressourcenserver Decision Strategywieder an Unanimous. Kehren Sie erneut zu den Schritten 1 bis 6 zurück, setzen Sie diesmal jedoch die Rolle als account_owner. Dieses Mal ist das Endergebnis wieder PERMITsinnvoll, da der account_ownerZugriff sowohl auf das resourceals auch auf das hat scope.

Ordentlich :) Hoffe das hilft.

Andy
quelle
1
@SANDEEPMACHIRAJU Gern geschehen :) Gute Frage! Nicht genügend Zeichen, um eine ausführliche Antwort per Kommentar zu geben, aber Sie können den Token-Introspektionsendpunkt verwenden . Hier ist eine Liste aller Endpunkte . Ich denke, Sie können auch ihren Authorization Client verwenden, aber ich habe keine Erfahrung damit
Andy
7
Danke für die tolle Antwort.
Markus
3
@JWo Gern geschehen! Tbh, kein besonderer Grund. Ich habe das Beispiel so einfach wie möglich gehalten, um jemanden zum Laufen zu bringen. Ich weiß aus Erfahrung, dass die Dokumente nicht die aufregendsten Dinge sind, die es zu lesen gilt. Für einen anderen Client, der Zugriff auf die Bank-API benötigt, scheint es, als würden Sie suchen, User Management Access (UMA)wo der Ressourcenbesitzer dem anfragenden Teilnehmer Zugriff auf eine geschützte Ressource gewähren kann (zumindest ist dies meine Interpretation).
Andy
3
Du machst die Welt definitiv zu einem besseren Ort, danke, dass du dir die Zeit genommen hast, all das zusammenzustellen ... Du solltest ein paar Blog-Beiträge darüber schreiben! Sehr nützlich @Andy
José Carlos
1
@ Andy nur wow! Vielen Dank, dass Sie sich die Zeit genommen haben, die gesamte Auth Services-Dokumentation zu verarbeiten und mit uns zu teilen. Sie haben vielen Menschen viele Stunden des Lernens erspart! Es gibt nur eine Sache, die ich nicht sehen kann. Du hast gesagt account_owner has access to the account:view scope. Wie stellen Sie die Beziehung zwischen dieser Rolle und diesem Bereich her?
Codependent
5

Ich wollte die Autorisierung über reine HTTP-Methoden erzwingen, ohne den Adapter zu verwenden, da Lua keinen Adapter hatte. Hoffe, diese Antwort hilft Menschen, die nach einer nicht adapterbasierten Methode suchen.

Wenn Sie nach dem Adapter suchen, lesen Sie die Kurzanleitung ist der beste Ort zu beginnen. Besonders das Spring Boot Authz Beispiel .

Für eine reine HTTP-basierte Implementierung:

Schritt 1:

Definieren Sie die Richtlinien und Berechtigungen in der Keycloak Admin-Benutzeroberfläche

Schritt 2

Haben Sie eine interne Zuordnung, welche HTTP-Pfade zu welchen Ressourcen gehören und welche Bereiche für jeden Pfad erforderlich sind. Dies kann auch in der gespeichert werden Konfigurationsdatei gespeichert werden . Wenn eine bestimmte Route aufgerufen wird, rufen Sie den Keycloak-Token-Endpunkt auf, um die Ansprüche des Zugriffstokens zu überprüfen.

{
  "policy-enforcer": {
    "user-managed-access" : {},
    "enforcement-mode" : "ENFORCING"
    "paths": [
      {
        "path" : "/someUri/*",
        "methods" : [
          {
            "method": "GET",
            "scopes" : ["urn:app.com:scopes:view"]
          },
          {
            "method": "POST",
            "scopes" : ["urn:app.com:scopes:create"]
          }
        ]
      }
    ]
  }
}

Wenn Sie einen Adapter verwenden und den Pfad oder die Ressource nicht angeben, sucht der Adapter intern nach den Pfaden und Ressourcen von Keycloak .

Schritt 3:

Verwenden Sie den Token-Endpunkt, um die Berechtigungen abzurufen oder auszuwerten . Sie können response_modeParameter verwenden, um entweder die endgültige Entscheidung zu erhalten (ob Zugriff gewährt werden soll) oder um die gesamten Berechtigungen abzurufen.

curl -X POST \
  http://${host}:${port}/auth/realms/${realm}/protocol/openid-connect/token \
  -H "Authorization: Bearer ${access_token}" \
  --data "grant_type=urn:ietf:params:oauth:grant-type:uma-ticket" \
  --data "permission=Resource A#Scope A"

Wenn die Autorisierungsanforderung keiner Berechtigung zugeordnet ist, 403wird stattdessen ein HTTP-Statuscode zurückgegeben.

Nirojan Selvanathan
quelle