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:
- Ich werde versuchen, alle Ihre Fragen nach besten Kräften zu beantworten
- 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-Based
Berechtigungen wenden Sie es direkt auf Ihre Ressource an
- Um eine
Scoped-Based
Berechtigung 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: account
und transaction
, so würde ich mich zum zweiten Ansatz neigen.
Auf langer Sicht, einen globalen mit view
Umfang 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, Keycloak
ermöglicht dies für Ressourcen mit den gleichen type
. Sie könnten beispielsweise beides viewAccount
und den viewTransaction
Umfang 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
scope
oder 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 aggregated
Richtlinie (einer Richtlinienrichtlinie) und ordnen Sie diese aggregierte Richtlinie der scope-based
Berechtigung zu. Diese scoped-based
Berechtigung 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-based
Berechtigungstyp erstellen und andere Berechtigungen separat ausschließlich einem Bereich über den scope-based
Berechtigungstyp 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
- Der Ressourcenserver
Decision Strategy
- Jede Erlaubnis ist
Decision Strategy
Logic
Wert jeder Richtlinie .
Der Logic
Wert ist ähnlich wie beim Java- !
Operator. Es kann entweder sein Positive
oder Negative
. Wenn dies der Fall Logic
ist Positive
, bleibt die endgültige Bewertung der Richtlinie unverändert. Wenn dies der Fall ist , wird Negative
das Endergebnis negiert (z. B. wenn eine Richtlinie als falsch bewertet Logic
wird Negative
und dies der Fall ist , ist dies der Fall true
). Nehmen wir zur Vereinfachung an, dass der Wert Logic
immer auf eingestellt ist Positive
.
Das Decision Strategy
ist es, was wir wirklich angehen wollen. Das Decision Strategy
kann entweder sein Unanimous
oder 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 Logic
ist Positive
für alle Richtlinien). Jetzt:
Permission One
hat einen Decision Strategy
Satz zu Affirmative
. Es gibt auch drei Richtlinien, in denen jeweils Folgendes bewertet wird:
Da eine der Richtlinien auf gesetzt ist true
, Permission One
ist auf gesetzt true
(bejahend - nur 1 muss sein true
).
Permission Two
hat einen Decision Strategy
Satz Unanimous
mit 2 Richtlinien:
In diesem Fall Permission Two
ist false
eine Richtlinie falsch (einstimmig - sie müssen alle sein true
).
- Nun kommt die endgültige Bewertung. Wenn der Ressource - Server
Decision Strategy
gesetzt ist Affirmative
, den Zugang zu dieser Ressource gewährt werden würde , da Permission One
ist true
. Wenn andererseits der Ressourcenserver auf Decision Strategy
eingestellt ist, Unanimous
wird 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:
- Der Ressourcenserver ist
Decision Strategy
auf Unanimous
oder eingestelltAffirmative
- Die Berechtigung zum Zugriff auf die
account/{id}
Ressource isttrue
- Die Berechtigung zum Zugriff auf den
view
Bereich isttrue
Sie erhalten Zugriff auf das Konto.
true
+ true
ist gleich true
unter dem Affirmative
oder Unanimous
Decision Strategy
.
Nun, wenn Sie das haben
- Ressourcenserver ist auf
Decision Strategy
eingestelltAffirmative
- Die Berechtigung zum Zugriff auf die
account/{id}
Ressource isttrue
- Die Berechtigung zum Zugriff auf den
view
Bereich istfalse
Sie erhalten außerdem Zugriff auf das Konto.
true
+ false
steht true
unter der Affirmative
Strategie.
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:
- Erstellen Sie Ihre Ressource (z. B.
/account/{id}
) und ordnen Sie sie dem account:view
Bereich zu.
- Erstellen Sie eine rollenbasierte Richtlinie und fügen Sie die
helpdesk
Rolle unter dieser Richtlinie hinzu
- Erstellen Sie eine
Scope-Based
Berechtigung namens viewAccount
und verknüpfen Sie sie mit scope
, resource
undpolicy
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:
- Wir werden ein neues Reich namens erstellen
stackoverflow-demo
- In
bank-api
diesem Bereich erstellen wir einen Client
- Wir werden eine Ressource definieren, die
/account/{id}
für diesen Client aufgerufen wird
- Das
account/{id}
wird den account:view
Umfang haben
- Wir erstellen einen Benutzer, der
bob
unter dem neuen Bereich aufgerufen wird
- Wir werden nun auch drei Rollen:
bank_teller
, account_owner
unduser
- Wir werden
bob
keine Rollen zuordnen. Dies wird derzeit nicht benötigt.
- Wir werden die folgenden zwei
Role-Based
Richtlinien einrichten :
bank_teller
und account_owner
haben Zugriff auf die /account/{id}
Ressource
account_owner
hat Zugriff auf den account:view
Bereich
user
hat keinen Zugriff auf die Ressource oder den Bereich
- Wir werden mit dem
Evaluate
Tool 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
- Gehe zu
http://localhost:8080/auth
- Klicken Sie auf den
Administration Console
Link
- 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
- Bewegen Sie die Maus über das
master
Reich und klicken Sie auf die Add Realm
Schaltfläche.
- Geben Sie
stackoverflow-demo
als Namen ein.
- Klicken Sie auf
Create
.
- Oben links sollte jetzt
stackoverflow-demo
statt des master
Reiches stehen.
Siehe Erstellen eines neuen Bereichs
Erstellen Sie einen neuen Benutzer
- Klicken Sie auf den
Users
Link links
- Klicken Sie auf die
Add User
Schaltfläche
- Geben Sie die
username
(zB bob
)
- Stellen Sie sicher, dass eingeschaltet
User Enabled
ist
- Klicken
Save
Siehe Erstellen eines neuen Benutzers
Erstellen Sie neue Rollen
- Klicken Sie auf den
Roles
Link
- Klicke auf
Add Role
- Fügen Sie die folgenden Rollen:
bank_teller
, account_owner
unduser
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
- Klicken Sie auf den
Clients
Link
- Klicke auf
Create
- Geben Sie
bank-api
für dieClient ID
- Für die
Root URL
Eingabehttp://127.0.0.1:8080/bank-api
- Klicke auf
Save
- Stellen Sie sicher , dass
Client Protocol
istopenid-connect
- Ändern Sie das
Access Type
inconfidential
- Wechseln Sie
Authorization Enabled
zuOn
- Scrollen Sie nach unten und drücken Sie
Save
. Authorization
Oben sollte eine neue Registerkarte angezeigt werden.
- Klicken Sie auf die
Authorization
Registerkarte und dannSettings
- Stellen Sie sicher, dass das auf eingestellt
Decision Strategy
istUnanimous
- Dies ist der Ressourcenserver
Decision Strategy
Sehen:
Erstellen Sie benutzerdefinierte Bereiche
- Klicken Sie auf die
Authorization
Registerkarte
- Klicken Sie auf
Authorization Scopes
> Create
, um die Add Scope
Seite aufzurufen
- Geben Sie
account:view
den Namen ein und drücken Sie die Eingabetaste.
Erstellen Sie "Kontoressource anzeigen"
- Klicken Sie oben auf den
Authorization
Link
- Klicke auf
Resources
- Klicke auf
Create
- Geben Sie
View Account Resource
sowohl für Name
als auch einDisplay name
- Geben Sie
account/{id}
für dieURI
- Geben Sie
account:view
in das Scopes
Textfeld ein
- Klicken
Save
Siehe Erstellen von Ressourcen
Erstellen Sie Ihre Richtlinien
Authorization
Klicken Sie erneut unter der Registerkarte aufPolicies
- Wählen
Role
aus der Create Policy
Dropdown-Liste
- Geben Sie im
Name
Abschnitt Folgendes einOnly Bank Teller and Account Owner Policy
- Wählen
Realm Roles
Sie unter bank_teller
und ausaccount_owner
Rolle
- Stellen Sie sicher, dass eingestellt
Logic
istPositive
- Klicken
Save
- Klick auf das
Policies
Link
- Wählen Sie
Role
erneut ausCreate Policy
Dropdown-Liste.
- Diesmal
Only Account Owner Policy
für dieName
- Klicken
Realm Roles
Sie unter Auswählenaccount_owner
- Stellen Sie sicher, dass eingestellt
Logic
istPositive
- Klicken
Save
- Klicken Sie oben auf den
Policies
Link. 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
Authorization
Klicken Sie erneut unter der Registerkarte aufPermissions
- Wählen
Resource-Based
- Geben Sie
View Account Resource Permission
für dieName
- Unter
Resources
TypView Account Resource Permission
- Klicken
Apply Policy
Sie unter AuswählenOnly Bank Teller and Account Owner Policy
- Stellen Sie sicher, dass das auf eingestellt
Decision Strategy
istUnanimous
- Klicken
Save
Siehe Erstellen von ressourcenbasierten Berechtigungen
Puh...
Auswerten der ressourcenbasierten Berechtigung
- Wählen Sie erneut unter der
Authorization
Registerkarte ausEvaluate
- Unter
User
enterbob
- Klicken
Roles
Sie unter Auswählenuser
- Hier ordnen wir unseren Benutzer unseren erstellten Rollen zu.
- Klicken Sie unter
Resources
Auswählen View Account Resource
und klicken Sie aufAdd
- Klicken Sie auf Auswerten.
- Erweitern Sie die
View Account Resource with scopes [account:view]
, um die Ergebnisse anzuzeigen , und Sie sollten sehen DENY
.
- 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!
- Klick auf das
Back
Link direkt über dem Bewertungsergebnis
- Ändern Sie die Rolle von Bob in
account_owner
und 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
- Gehen Sie zurück zum
Permissions
Abschnitt
- Wählen Sie
Scope-Based
diese Zeit in der Create Permission
Dropdown-Liste aus.
- Geben Sie
Name
unter einView Account Scope Permission
- Geben Sie
Scopes
unter einaccount:view
- Geben Sie
Apply Policy
unter einOnly Account Owner Policy
- Stellen Sie sicher, dass das auf eingestellt
Decision Strategy
istUnanimous
- Klicken
Save
Siehe Erstellen bereichsbasierter Berechtigungen
Zweiter Testlauf
Bewertung unserer neuen Änderungen
- Gehen Sie zurück zum
Authorization
Abschnitt
- Klicke auf
Evaluate
- Benutzer sollte sein
bob
- Rollen sollten sein
bank_teller
- Ressourcen sollten sein
View Account Resource
und klickenAdd
- Klicken Sie auf
Evaluate
und wir sollten bekommen DENY
.
- Auch dies sollte nicht überraschen, da der
bank_teller
Zugang zum, resource
aber nicht zum hat scope
. Hier wird eine Berechtigung als wahr und die andere als falsch ausgewertet. Da der Ressourcenserver auf Decision Strategy
eingestellt ist, Unanimous
ist die endgültige Entscheidung DENY
.
- Klicken Sie
Settings
unter der Authorization
Registerkarte auf und ändern Sie das Decision Strategy
zu Affirmative
und 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).
- Wenden Sie der Vollständigkeit halber den Ressourcenserver
Decision Strategy
wieder 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 PERMIT
sinnvoll, da der account_owner
Zugriff sowohl auf das resource
als auch auf das hat scope
.
Ordentlich :) Hoffe das hilft.