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()
      }
    } 
  } 
}
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top