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