Bom pessoal, to aqui disponibilizando uma biblioteca que fiz, para controlar Acesso junto ao VRaptor.
Primeiro lugar os arquivos, e em seguida as explicações …
LIB => http://tomazlavieri.com.br/downloads/access4VRaptor-0.0.1.jar (36 kb o jar contém o srouce)
BLANK PROJECT => http://tomazlavieri.com.br/downloads/access4VRaptor-blank-project.zip (5.6 mb)
JavaDoc => http://tomazlavieri.com.br/docs/access4vraptor/
Obs.: tente acessar no blank project http://localhost:8080/vraptor-blank-project/logica-fechada
Como funciona ?
Tentei não amarrar o controle de acesso ao restante da logica, então ela funciona basicamente através de um componente de sessão que deve ser implementado usando-se a interface LoginSession
Esta é a inerface a qual o sistema conversa, e funciona de uma forma simples, ela só precisa informar se o usuário esta logado, e dado um recurso, se o usuário pode ou não abrir aquele recurso.
[code]// Informa se a requisição esta sendo feita através de uma sessão logada.
boolean isLogged()
// Informa se a sessão logada libera o acesso ao recurso indicado.
boolean hasAccess(ResourceMethod method)[/code]
Mas o que interceptar ? só de usar essa lib o sistema todo é travado ? a resposta é não!
Apenas Controles (Recursos) anotados com @ControlledResrouce, e neste caso todas as suas lógicas passam a ser também controlada pelo plug-in.
Obs.: @ControlledResource substitu a anotação @Resource, do VRaptor, e portanto a anotação do VRaptor deve ser removida.
Ou lógicas anotadas com @ControlledLogic e neste caso o restanto do recurso pode ser ou não de acesso livre.
Para onde vão os usuários que não estiverem logados ? e tentarem acessar um Lógica Controlada ??
- O plug-in irá procuar primeiro por uma lógica, dentro do mesmo recurso, anotado com @LoginLogic
- Caso não encontre o 1° o plug-in irá procurar por uma lógica anotada com @LogicLogin(defaultFor=DefaultLoginSession.class) caso o atributo sessionClass da anotação do @ControlledResource não esteja presente, ou então procurará pela class definida no sessionClass.
- Caso não encontre nenhuma das duas opções acima, a lógica será transferida para error 403 (acesso negado).
E caso o usuário esteja logado, mas o método hasAcess(ResrouceMethod) retorn false ? neste caso o plug-in executará uma lógica semelhante a de cima, porem levando em conta a anotação @DeniedLogic
- procura por @DeniedLogic dentro do mesmo recurso
- procura por @DeniedLogic definido por padrão para a LoginSession definida no atributo sessionClass.
- envia um error 403 (acesso negado).
Bom muito ja foi dito, mas como o hasAcess(ResrouceMethod) deve ser implementado ?
R: isso fica a cargo de cada implementação, e este é ponto onde o sistema fica mais solto.
Mas existe alguma implementação padrão ou algo parecido ?
R: sim! existe o AbstractRoleLogin esta classe fornece um suporte a mais algumas anotações:
- @Roles esta anotação pode definir um conjunto de papais que tem acesso a uma lógica/recurso, ou que são negados a acessar uma lógica/recurso.
- @SubRoles e @SubRole estas duas anotações são usada para definir no componente de sessão subclasse do AbstractRoleLogin como uma role contem um grupo de outras roles, você pode encontrar um exemplo no Blank Project, na classe LoginInfo
A forma como o login é feito, e qual é a role do usuário logado é definido por que extende essa classe abstrata, porem ela cuida sozinha de como resolver as roles anotadas nos recursos.
Gostei desse pacote, e queria testar, o que preciso fazer ? apenas baixara LIB e começar a usar ?? ou sou obrigado a inicia do blank project ?
R: Não. para usar em um projeto você precisa seguir poucos passos
1°) Fazer o download da lib, e colocar dentro de WEB-INF/lib
2°) alterar o arquivo web.xml e adicionar o pacote referente ao plug-ing conforme abaixo
<!-- caso já tenha esta anotação, apenas adicione o "br.com.simtecnologia.acesso.controle" no inicio, e coloque uma virgula. -->
<context-param>
<param-name>br.com.caelum.vraptor.packages</param-name>
<param-value>br.com.simtecnologia.acesso.controle</param-value>
</context-param>
3°) Implementar um LoginSession, de preferencia o DefaultLoginSession que é usado como padrão de todo o projeto.
4°) Quem não tem o último snapshot do vraptor, precisa usar uma classe de FIX, para corrigir um problema que não irá aparecer a partir da versão 3.1.2, esta classe é a FixedObjectResult, e deve ser adicionada dentro do seu projeto, afim de ser enchergada pelo VRpator, segue código => http://pastebin.com/AydRye0n
A partir dai, é só anotar com @ControlledResource no lugar de @Resource, nas lógicas que quiser ter controle de acesso.
Para melhor entendimento, verifique o blank project. experimentem, comentem,
Conteúdo do BLANK PROJECT:
Classes:
Att, Tomaz Lavieri