Zum Hauptinhalt springen

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.eft == 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:

  1. Geben Sie die Attribute im Modell Matcher an.
  2. Übergeben Sie die Strukt- oder Klasseninstanz des Elements als Argument in Casbins Enforce() Funktion.

:::Warnung

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 Politik verwenden müssen, was mit dem Trennzeichen von csv kollidiert, und wir müssen es entgehen. 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.eft == allow))

[matchers]
m = eval(p.sub_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, read
p, r.sub.Age < 60, /data2, write