Domanda

Sto usando Grails per creare un'applicazione che funziona principalmente come framework di servizi. La mia domanda è: i servizi possono essere garantiti allo stesso modo dei controller?

Esempio basato sull'URI:

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()
      }
    } 
  } 
}
È stato utile?

Soluzione

Non ho idea se il plugin Shiro supporta questo, ma il Plugin Acegi fa, anche se in modo "sperimentale" (qualunque cosa significhi).

Aggiornare

Dopo aver letto correttamente la domanda, sembra che tu stia chiedendo se puoi utilizzare i filtri per proteggere i servizi. Se questo è il caso, allora Shiro è in qualche modo irrilevante, perché sono i filtri che stanno eseguendo l'autorizzazione, non Shiro.

Quindi, per rispondere alla tua domanda se puoi utilizzare i filtri per proteggere i servizi, la risposta è no, perché hai accesso solo al controller all'interno di un filtro. Tuttavia, è possibile utilizzare il metaprogrammazione di Groovy per eseguire l'intercettazione del metodo in stile AOP sui servizi.

L'approccio di base è:

  • Per ogni servizio, aggiungi un invokeMethod Proprietà al metaclasse
  • Il valore di questa proprietà dovrebbe essere una chiusura. Questa chiusura intercetta (cioè essere chiamata anziché) ogni metodo chiamato sul servizio.
  • Questa chiusura dovrebbe
    • Esegui i controlli di sicurezza
    • Invoca il metodo originale se l'autorizzazione ha esito positivo e lancia un'eccezione (o mostra un errore) se l'autorizzazione fallisce

A parte

Se possibile, consiglio vivamente di utilizzare un plug -in di sicurezza comprovato (ad es. Shiro, ACEGI) per eseguire i controlli di autorizzazione piuttosto che arrotolare il proprio nel modo sopra descritto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top