

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Beispiel 1: Grundlegendes ABAC mit OPA und Rego
<a name="opa-abac-examples"></a>

In diesem Abschnitt wird ein Szenario beschrieben, in dem OPA verwendet wird, um Zugriffsentscheidungen darüber zu treffen, welche Benutzer auf Informationen in einem fiktiven Payroll-Microservice zugreifen dürfen. Es werden Rego-Codefragmente bereitgestellt, um zu demonstrieren, wie Sie Rego verwenden können, um Entscheidungen zur Zugriffskontrolle zu treffen. Diese Beispiele sind weder erschöpfend noch stellen sie eine vollständige Untersuchung der Funktionen von Rego und OPA dar. Für einen umfassenderen Überblick über Rego empfehlen wir Ihnen, die [Rego-Dokumentation auf der OPA-Website](https://www.openpolicyagent.org/docs/latest/#rego) zu lesen.

![Grundlegendes ABAC mit OPA und Rego](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/saas-multitenant-api-access-authorization/images/opa-example-1.png)


## Beispiel für grundlegende OPA-Regeln
<a name="basic-rules"></a>

Im vorherigen Diagramm lautet eine der Zugriffskontrollregeln, die von OPA für den Payroll-Microservice durchgesetzt wurden:

*Mitarbeiter können ihr Gehalt selbst ablesen.*

Wenn Bob versucht, auf den Payroll-Microservice zuzugreifen, um sein eigenes Gehalt einzusehen, kann der Payroll-Microservice den API-Aufruf an die OPA-API weiterleiten, um eine Zugriffsentscheidung zu RESTful treffen. Der Payroll-Service fragt OPA nach einer Entscheidung mit der folgenden JSON-Eingabe ab:

```
{
    "user": "bob",
    "method": "GET",
    "path": ["getSalary", "bob"]
}
```

OPA wählt auf der Grundlage der Abfrage eine oder mehrere Richtlinien aus. In diesem Fall wertet die folgende Richtlinie, die in Rego geschrieben ist, die JSON-Eingabe aus.

```
default allow = false
allow = true {
    input.method == "GET"
    input.path = ["getSalary", user]
    input.user == user
}
```

Diese Richtlinie verweigert standardmäßig den Zugriff. Anschließend wird die Eingabe in der Abfrage ausgewertet, indem sie an die globale Variable gebunden wird. `input` Der Punktoperator wird mit dieser Variablen verwendet, um auf die Werte der Variablen zuzugreifen. Die Rego-Regel `allow` gibt true zurück, wenn die Ausdrücke in der Regel ebenfalls wahr sind. Die Rego-Regel überprüft, ob `method` in der Eingabe GET entspricht. Anschließend wird überprüft, ob das erste Element in der Liste vorhanden `path` ist, `getSalary` bevor der Variablen das zweite Element in der Liste zugewiesen wird. `user` Schließlich überprüft es, ob es sich um den Pfad handelt, auf den zugegriffen wird, `/getSalary/bob` indem überprüft wird, ob die `user` Anfrage,, gestellt wird`input.user`, mit der `user` Variablen übereinstimmt. Die Regel `allow` wendet die Wenn-Dann-Logik an, um einen booleschen Wert zurückzugeben, wie in der Ausgabe gezeigt:

```
{
    "allow": true
}
```

## Teilregel, die externe Daten verwendet
<a name="partial-rules"></a>

Um zusätzliche OPA-Funktionen zu demonstrieren, können Sie der Zugriffsregel, die Sie durchsetzen, Anforderungen hinzufügen. Nehmen wir an, Sie möchten diese Zugriffskontrollanforderung im Kontext der vorherigen Abbildung durchsetzen: 

*Mitarbeiter können das Gehalt aller Mitarbeiter ablesen, die ihnen unterstellt sind.*

In diesem Beispiel hat OPA Zugriff auf externe Daten, die importiert werden können, um eine Zugriffsentscheidung zu treffen:

```
"managers": {
        "bob": ["dave", "john"],
        "carol": ["alice"]
}
```

 Sie können eine beliebige JSON-Antwort generieren, indem Sie in OPA eine Teilregel erstellen, die statt einer festen Antwort eine Reihe von Werten zurückgibt. Dies ist ein Beispiel für eine Teilregel:

```
direct_report[user_ids] {
    user_ids = data.managers[input.user][_]
}
```

 Diese Regel gibt eine Gruppe aller Benutzer zurück, die über den Wert von berichten`input.user`, der in diesem Fall ist`bob`. Das `[_]` Konstrukt in der Regel wird verwendet, um über die Werte der Menge zu iterieren. Dies ist die Ausgabe der Regel:

```
{
    "direct_report": [
      "dave",
      "john"
    ]
}
```

Durch das Abrufen dieser Informationen kann festgestellt werden, ob ein Benutzer einem Manager direkt unterstellt ist. Für einige Anwendungen ist die Rückgabe von dynamischem JSON der Rückgabe einer einfachen booleschen Antwort vorzuziehen.

## Zusammenführung
<a name="abac-combination"></a>

Die letzte Zugriffsanforderung ist komplexer als die ersten beiden, da sie die in beiden Anforderungen angegebenen Bedingungen kombiniert:

*Die Mitarbeiter können ihr eigenes Gehalt und das Gehalt aller Personen, die ihnen unterstellt sind, ablesen.*

Um diese Anforderung zu erfüllen, können Sie diese Rego-Richtlinie verwenden:

```
default allow = false
 
allow = true {
    input.method == "GET"
    input.path = ["getSalary", user]
    input.user == user
}
 
allow = true {
    input.method == "GET"
    input.path = ["getSalary", user]
    managers := data.managers[input.user][_]
    contains(managers, user)
}
```

Die erste Regel in der Richtlinie gewährt jedem Benutzer Zugriff, der versucht, seine eigenen Gehaltsinformationen einzusehen, wie bereits beschrieben. Zwei Regeln mit demselben Namen zu haben`allow`, funktioniert in Rego als logischer **Operator oder**. Die zweite Regel ruft die Liste aller direkt unterstellten Mitarbeiter ab, die mit `input.user` (aus den Daten im vorherigen Diagramm) verknüpft sind, und weist diese Liste der Variablen zu. `managers` Schließlich überprüft die Regel, ob der Benutzer, der versucht, sein Gehalt einzusehen, direkt unterstellt ist, `input.user` indem überprüft wird, ob sein Name in der Variablen enthalten ist. `managers`

Die Beispiele in diesem Abschnitt sind sehr einfach und bieten keine vollständige oder gründliche Erläuterung der Funktionen von Rego und OPA. [Weitere Informationen finden Sie in der [OPA-Dokumentation](https://www.openpolicyagent.org/docs/latest/), in der [ GitHub OPA-README-Datei](https://github.com/open-policy-agent/opa) und experimentieren Sie im Rego Playground.](https://play.openpolicyagent.org/)