ABAC
Was ist eigentlich das ABAC-Modell?
ABAC ist Attribute-Based Access Control
, was bedeutet, dass Sie die Attribute (Eigenschaften) des Betreffs verwenden können -Objekt oder Aktion statt sich selbst (die Zeichenkette), um den Zugriff zu kontrollieren. Sie können bereits von einer komplizierten ABAC-Zugangskontrollsprache namens XACML hören. Im Vergleich zu XACML ist Casbin's ABAC sehr einfach: in ABAC, Sie können für Modellelemente Strukturen (oder Klasseninstanzen, die auf der Programmiersprache basieren) anstelle von Strings verwenden.
Verwenden Sie zum Beispiel das offizielle ABAC-Beispiel:
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[policy_effect]
e = some(where (p. ft == allow))
[matchers]
m = r.sub == r.obj.Owner
Wir verwenden r.obj.Owner
statt r.obj
im Matcher. Die r.obj
in der Funktion Enforce()
übergeben wurde, wird eine Strukt- oder Klasseninstanz anstelle von String sein. Casbin wird Reflexionen verwenden, um die obj
Mitgliedsvariable in diesem strukt oder der Klasse für Sie abzurufen.
Hier ist eine Definition für den r.obj
struct oder Klasse:
type testResource struct {
Name string
Owner string
}
Wie verwende ich ABAC?
Um nur ABAC zu verwenden, müssen Sie zwei Dinge tun:
- Geben Sie die Attribute im Modell Matcher an.
- Übergeben Sie die Strukt- oder Klasseninstanz des Elements als Argument in Casbins
Enforce()
Funktion.
warning
Zurzeit nur Elemente wie r.sub
, r.obj
, r.act
und so weiter unterstützen ABAC. Du kannst es nicht für Richtlinien-Elemente wie p verwenden. ub
, weil es keine Möglichkeit gibt, einen Strukt oder eine Klasse in Casbins Richtlinien zu definieren.
tip
Sie können mehrere ABAC-Attribute in einem Matcher verwenden, zum Beispiel: m = r.sub.Domain == r.obj.Domain
.
tip
Wenn Sie Komma in der Richtlinie verwenden müssen, die mit dem csv-Trennzeichen kollidiert, und wir es vermeiden müssen. Casbin analysiert die Richtlinien-Datei durch csv-Bibliothek, Sie können Anweisung mit Anführungszeichen umgeben. "keyMatch("bob", r.sub.Rolle)"
wird nicht geteilt.
Skalierung des Modells für komplexe und große Anzahl von ABAC-Regeln.
Die obige Instanz der ABAC-Implementierung ist sehr einfach aber oft benötigt das Autorisierungssystem eine sehr komplexe und große Anzahl von ABAC-Regeln. Um dieser Notwendigkeit gerecht zu werden, wird die obige Implementierung die Ausführlichkeit des Modells in einem großen Maße erhöhen. Daher ist es klug, die Regeln in die Richtlinie einzufügen anstatt in das Modell. Dies geschieht durch Einführung eines eval()
Funktionsbaus. Unten ist die Beispielinstanz, um solche ABAC-Modelle zu verwalten.
Dies ist die Definition der CONF
Datei, die zur Definition des ABAC-Modells verwendet wird.
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub_rule, obj, act
[policy_effect]
e = some(where (p. ft == allow))
[matchers]
m = eval(p. ub_rule) && r.obj == p.obj && r.act == p.act
Hier ist p.sub_rule
vom Typ struct oder Klasse (benutzerdefinierter Typ), die aus notwendigen Attributen besteht, die in der Richtlinie verwendet werden sollen.
Dies ist die Richtlinie, die gegen das Modell für Vollstreckung
verwendet wird. Nun können Sie die Objektinstanz, die an eval()
übergeben wird, als Parameter verwenden, um bestimmte ABAC-Einschränkungen zu definieren.
p, r.sub.Age > 18, /data1, lesen
p, r.sub.Age < 60, /data2, schreiben