Verwenden von Shiro, um Dienste in Grails zu sichern
Frage
Ich verwende Grails, um eine Anwendung zu erstellen, die hauptsächlich als Service -Framework fungiert. Meine Frage ist: Können Dienste auf die gleiche Weise wie Controller gesichert werden?
URI-basiertes Beispiel:
class SecurityFilters {
def filters = {
all(uri: "/**") {
before = {
// Ignore direct views (e.g. the default main index page).
if (!controllerName) return true
// Access control by convention.
accessControl()
}
}
}
}
Lösung
Ich habe keine Ahnung, ob das Shiro -Plugin dies unterstützt, aber das Acegi Plugin tut, wenn auch in einer "experimentellen" Weise (was auch immer das bedeutet).
Aktualisieren
Nachdem Sie die Frage ordnungsgemäß gelesen haben, scheinen Sie zu fragen, ob Sie Filter verwenden können, um Dienste zu sichern. Wenn dies der Fall ist, dann ist Shiro etwas irrelevant, da es die Filter sind, die die Genehmigung durchführen, nicht Shiro.
Um Ihre Frage zu beantworten, ob Sie Filter verwenden können, um Dienste zu sichern, lautet die Antwort Nein, da Sie nur Zugriff auf den Controller innerhalb eines Filters haben. Sie können jedoch eine groovige Metaprogrammierung verwenden, um eine AOP-Methode für Dienste durchzuführen.
Der grundlegende Ansatz ist:
- Fügen Sie für jeden Dienst eine hinzu
invokeMethod
Eigentum zur Metaklasse - Der Wert dieser Eigenschaft sollte eine Schließung sein. Diese Schließung wird (dh anstelle von) jede Methode, die den Dienst aufgerufen hat, abgefangen.
- Diese Schließung sollte
- Führen Sie die Sicherheitskontrollen durch
- Rufen Sie die ursprüngliche Methode auf, wenn die Autorisierung erfolgreich ist, und werfen Sie eine Ausnahme (oder zeigen Sie einen Fehler an), wenn die Autorisierung fehlschlägt
Beiseite
Wenn möglich, würde ich dringend empfehlen, ein bewährtes Sicherheits -Plugin (z. B. Shiro, Acegi) zu verwenden, um die Autorisierungsprüfungen durchzuführen, anstatt Ihre eigenen in der oben beschriebenen Weise zu rollen.