Utilizzo di Shiro per proteggere i servizi in Grails
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()
}
}
}
}
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.