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()
      }
    } 
  } 
}
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top