Usando Shiro para proteger serviços em Grails
Pergunta
Estou usando Grails para criar um aplicativo que funcione principalmente como uma estrutura de serviço. Minha pergunta é: os serviços podem ser garantidos da mesma maneira que os controladores?
Exemplo baseado em 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()
}
}
}
}
Solução
Não tenho ideia se o plug -in Shiro suporta isso, mas o Plug -in ace faz, embora de maneira "experimental" (o que quer que isso signifique).
Atualizar
Depois de ler a pergunta corretamente, parece que você está perguntando se você pode usar filtros para proteger serviços. Se for esse o caso, Shiro é um pouco irrelevante, porque são os filtros que estão realizando autorização, não Shiro.
Portanto, para responder à sua pergunta sobre se você pode usar filtros para proteger os serviços, a resposta é não, porque você só tem acesso ao controlador de um filtro. No entanto, você pode usar o metaprogramação Groovy para fazer a interceptação do método de estilo AOP nos serviços.
A abordagem básica é:
- Para cada serviço, adicione um
invokeMethod
propriedade para o metaclasse - O valor dessa propriedade deve ser um fechamento. Esse fechamento interceptará (ou seja, será chamado em vez de) cada método chamado no serviço.
- Este fechamento deve
- Execute as verificações de segurança
- Invoque o método original se a autorização for bem -sucedida e jogue uma exceção (ou mostre um erro) se a autorização falhar
Aparte
Se possível, eu recomendo fortemente o uso de um plug -in de segurança comprovado (por exemplo, Shiro, ACEGI) para executar as verificações de autorização, em vez de rolar a sua da maneira descrita acima.