Autenticação e autorização com Grails
Este blog deixou de ser mantido, mas o autor continua escrevendo aqui. Não deixe de assinar o novo feed!
Aqui vai mais um daqueles posts onde conto um pouco das experiências que estou tendo com o Grails, o pequeno-grande framework web. Para ser mais específico, trago aqui algum código que mostra como implementar um esquema simples de autenticação e autorização em uma aplicação Grails. Mas, antes de mostrar qualquer código, deixe-me introduzí-lo ao “problema”.
Imagine que você esteja desenvolvendo uma aplicação pequena em Grails e que tal aplicação tenha controle de usuários, onde cada usuário tem um papel (administrador e convidado, por exemplo).
Para que um usuário tenha acesso à aplicação, primeiramente ele deverá fazer login. Feito o login, o usuário está liberado para utilizar todas as funções compatíveis com o seu papel. Por exemplo, um usuário convidado pode apenas executar operações de leitura, como pesquisas e relatórios, enquanto que um usuário administrador pode, hmm, fazer qualquer coisa.
A chance de você já ter visto (e implementado) uma aplicação com esses requisitos é bem grande. Então, para facilitar as coisas para quando você estiver encarando o Grails em um projeto, mostrarei neste post algumas dicas (e códigos) sobre como implementar tais requisitos, de uma forma simples e elegante.
Autenticação
A parte da autenticação é bem fácil de fazer sendo que, para a maioria dos casos, a criação de um Controller especial para demarcar as “opções protegidas” resolve bem o problema:
-
-
// todos os controllers protegidos estenderão este controller
-
}
-
Em seguida, definimos um beforeInterceptor para checar se o usuário se logou no sistema. Nada de anormal aqui:
- Usuário logado? A Action requisitada é invocada;
- Usuário não logado? A página
Loginé mostrada.
-
-
-
-
/* dados da requisição armazenados para serem usados após o login */
-
session.reqAction = actionUri
-
session.reqParams = params
-
redirect(controller: ‘login’, action: ’show’)
-
result = false
-
}
-
}
-
}
-
Mais detalhes sobre a utilização de Interceptors no Grails podem ser vistos na documentação do framework. O código do Controller Login não será mostrado por não ser tão importante no contexto deste post.
Autorização
Quase tudo o que é preciso para implementar a autenticação foi mostrado. Agora, precisamos definir um esquema simples para que possamos liberar o acesso às funções do sistema de acordo com o papel de um usuário.
Primeiramente, vamos definir um valor numérico para cada papel, onde quanto menor o valor, maior é o nível de acesso. Para este exemplo:
- Papel administrador = 0;
- Papel convidado = 1;
- Papel xxxx = 2;
- etc…
Desta forma, caso um usuário convidado (nível 1) tente acessar uma função no sistema cujo nível mínimo de acesso é zero (administrador), a única coisa que tal usuário verá no seu browser é uma página com os dizeres:
Access denied.
Veja abaixo um exemplo de como poderíamos definir os níveis de acesso para as nossas Actions dentro de um Controller qualquer:
-
-
-
/* map nome_da_action: nivel_minimo */
-
-
/* as actions abaixo só podem ser invocadas por administradores */
-
-
/* a action abaixo só pode ser invocada por administradores e convidados */
-
-
/* a action abaixo pode ser invocada por qualquer usuário autenticado */
-
}
-
Não seria legal se pudéssemos controlar o acesso às Actions da forma que foi mostrada no código? O bom é que isso é possível… nada que a boa e velha reflection não resolva!
Segue abaixo o código modificado do Controller RestrictedController, que permite o uso das constraints da forma que foi mostrada na listagem anterior:
-
-
-
-
}
-
-
/* obtém as constraints da action sendo invocada */
-
-
/* verifica se o usuário tem acesso a tal action */
-
result = (session.user.role <= role)
-
}
-
-
sendAccessDeniedRedirect() // oooooops!
-
}
-
result
-
}
-
-
-
def getter
-
-
try {
-
/* um pouquinho de reflection aqui… */
-
getter = getClass().getMethod(‘getConstraints’)
-
}
-
}
-
value
-
}
-
-
session.reqAction = actionUri
-
session.reqParams = params
-
redirect(controller: ‘login’, action: ’show’)
-
result = false
-
}
-
result
-
}
-
-
flash.message = ‘Access denied’
-
redirect(‘controller’: controller)
-
}
-
}
-
Pronto. Agora todo Controller que estenda RestrictedController pode declarar uma propriedade constraints com os dados para autorização. Ok, é meio babaca, mas basta para a maioria das aplicações.
Então é isso… até o próximo post!
Foto por: Semih Hazar
Tags: autenticação, exemplo, grails, groovy, java, tutorial

17 de julho de 2008 às 6:22 pm
Show de bola o seu post.
Valeu.
17 de julho de 2008 às 7:44 pm
Valeu pela força!
Como este post já é meio antigo, nesse meio tempo acabaram surgindo outras opções mais interessantes para se fazer esse tipo de coisa. Várias delas podem ser vistas na página de Plugins do site oficial do Grails:
http://grails.org/Plugins#Security%20Plugins
Grande abraço!