Wie funktioniert die regelbasierte Autorisierung mit Spring Security in Grails?

9

Spring Security ist großartig für die rollenbasierte Autorisierung, scheint aber bei der regelbasierten Autorisierung zu kurz zu greifen. Sicher, es gibt Möglichkeiten, dies über SpEL zu tun, aber diese Route scheint Ihre Autorisierungslogik in den Annotationen zu sperren, wenn es viel besser wäre, diese Logik in einen Service zu integrieren, so dass mehrere Orte die gleiche Logik verwenden können. p>

Es scheint einige Wege zu < a href="https://stackoverflow.com/questions/5250397/criteria-based-authorization-check-with-spring-security"> gehen über Hinzufügen von eigenen SpEL-Ausdrücken, aber besonders bemerkenswert ist, und sogar diejenigen, die für mich sinnvoll sind scheinen zu kurz zu kommen. Ich denke, da flexibel Groovy ist, muss eine Möglichkeit sein, die Abhängigkeiten nicht fest zu codieren, sondern die Sicherheitsregeln (oder SpEL Erweiterungen) zur Laufzeit abgerufen.

Obwohl es nicht ideal ist, wäre sogar etwas scheinbar Einfaches wie das Definieren aller gewünschten neuen Regeln und das Eingeben der As Mixins (dh SecurityExpressionRoot.mixin MyRule1 ) ein guter Anfang, aber das scheint nicht zu funktionieren.

>

Kennt jemand ein Beispiel, das das tut? Wenn nicht, wie könnte ich das selbst machen?

Ein (vereinfachtes) Beispiel: Ein Benutzer kann nur dann eine bestimmte Aktion (dh eine Dienstmethode ausführen) mit einem Objekt ausführen, wenn 3 von 4 Feldern Werte über einem bestimmten Schwellenwert haben, aber nur, wenn das Objekt weniger als 3 Tage hat alt:

%Vor%

Und das ist eine der einfacheren Regeln.

    
cdeszaq 18.12.2012, 22:34
quelle

3 Antworten

2

Rollenbasierte Autorisierung ist der einfachste, aber weniger flexible Weg. Der Kontrast dazu ist das ACL-System . Bei ACLs können Sie genau festlegen, wer zur Laufzeit was auf welches -Objekt ausführen darf. Auf der anderen Seite erfordert dies ein viel komplizierteres Setup. Es gibt auch ein Grails-Plugin .

Die Art der Verwendung von Annotationen mit SpEL-Ausdrücken liegt irgendwo zwischen diesen beiden Alternativen. Sie sind flexibler als einfache Rollen und einfacher als ACLs. Wenn Sie eine Einführung in die Methodensicherheit in Grails suchen, this Blogbeitrag, den ich vor einiger Zeit geschrieben habe, kann dir helfen.

    
micha 18.12.2012 22:45
quelle
1

Sie können Ihre Regel in Requestmap , die dynamische Konfigurationsmöglichkeiten bietet.

Definieren Sie zum Beispiel zuerst den Sicherheitstyp als Requestmap in config.groovy:

%Vor%

Dann können Sie die Anfragemap-Domain-Klasse ähnlich wie Benutzer und Rolle haben, wie folgt:

%Vor%

Jetzt, da Benutzer, Rolle und Reqestmap alle in der Datenbank gespeichert sind, können Sie Ihre Regeln leicht durch CRUD-Aktionen in einem Controller ändern, ohne dass Sie Ihren Service neu bereitstellen oder neu starten müssen. So:

%Vor%

In der Ansichtsschicht können Sie Ihre Menüs, Schaltflächen und anderen Elemente verwalten, die eine Autorisierung benötigen, indem Sie ein Federsicherheits-Tag wie:

verwenden %Vor%

Daher entsprechen die Ansichten auch der Autorisierungsregel.

Außerdem gibt es eine hierarchische Rollen Feature, das verwendet werden kann, um Unordnung in Ihren Anforderungszuordnungen zu reduzieren.

    
coderLMN 19.12.2012 04:15
quelle
0

Aus dem Beispiel, das Sie gepostet haben, könnte GCcontracts das sein, wonach Sie suchen. Sie müssen nur herausfinden, wie Sie auf den Principal zugreifen, wenn Sie eine GContract-Closure ausführen, aber das könnte genauso einfach sein wie die Übergabe als Parameter an die kontrahierte Methode.

    
schmolly159 19.12.2012 14:42
quelle