[CONTRIBUIÇÃO] VRaptor 3 - Plug-in para Controlar Acesso

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 ??

  1. O plug-in irá procuar primeiro por uma lógica, dentro do mesmo recurso, anotado com @LoginLogic
  2. 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.
  3. 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

  1. procura por @DeniedLogic dentro do mesmo recurso
  2. procura por @DeniedLogic definido por padrão para a LoginSession definida no atributo sessionClass.
  3. 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

Ótima iniciativa, parabéns amigo!

boa demais da conta. Vou testar logo que chegar em casa, na minha app que estou começando agora, e já ia bater cabeça pra controlar acesso da moçada! Tá de parabéns. Assim que eu testar e fazer funcionar direitinho, eu posto os parabéns! :smiley:

Pelo que eu contei essa já é a terceira contribuição de plugin ao vraptor. Bom saber que o vraptor tem evoluído assim de forma a ver o pessoal investindo parte do seu tempo criando essas ferramentas para facilitar a vida de quem desenvolve com o vraptor.

Parabéns Lavieri. Embora eu não use tua implementação, pois uso JAAS, creio que muita gente aqui irá usar.

Abraços :thumbup:

Quando chegar em casa comento os elogios da galera, e dou um lida completa no post, de antemao, muito obrigado a todos que dao forca…

Preparando a versao 0.0.2, previsto para proxima versao

  • Component LoginFlow, com o metodo “retrieveFlow(result)”, que vai recuperar o caminho do fluxo, antes do plug-in interceptar e encaminhar para pagina de login, util para quando a pagina de login e’ so um step-and-go, de atutenticacao, e em seguida quer se retornar para onde o usuario estava.

a ideia e’

        @LoginLogic(defaultFor=DefaultLoginSession.class)
        public void login(String login,String senha) {
                if (loginInfo.login(login, senha)) {
                        if (loginFlow.wasInterceptedFlow()) //se o fluxo foi interrompido para fazer login
                                loginFlow.retriveFlow(result);
                        else //o usuario pode ter ido diretamente a pagina de login
                                result.redirectTo(this).index();
                }
        }

mais explicacoes quando estiver pronto

Bom, não postei o novo pack ontem, pois ainda tem um probleminha para resolver (A Serialização de métodos dentro da sessão)

Vou resolver hoje a noite quando chegar em casa.
As funcionalidades propostas acima, ja estão funcionando, com algumas melhoras, porem o no restart do servidor (quando ele serializa e dezserializa) um objeto que guardo dentro da seção não pode ser serialziando acabando que gera exceções, o programa continua funcionanado, e se recupera do problema, porem eu vou corrigir a serializada da calsse LoginFlow

Obs.: o problema é que este objeto guarda os métodos das lógicas interceptados, para posterior recuperação, o objetos do tipo Method, não aceitam serialização.

Agora o projeto se encontra hospedado no google code: http://code.google.com/p/access4vraptor/

o SRC dele pode ser acessado via SVN, ou via browser => SRC

A versão atual que esta no site é a 0.0.2b, infelismente neste SVN não há registro da versão 0.0.1, vou colocar o JAR das duas versões assim que chegar em casa

A forma de utilização ficou mais ou menos assim:

        @LoginLogic(defaultFor=DefaultLoginSession.class) 
        public void login(String login,String senha,Long loginFlowId) { //#1
                if (loginInfo.login(login, senha)) {
                        if (loginFlow.retrieveFlowBeforeLogin(loginFlowId)  //#2
                                || loginFlow.retrieveFlowBeforeLogin() )  //#3
                                return;
                        else
                                result.redirectTo(this).index(); //#4
                }
        }

        //#1 o loginFlowId é opicional, ele serve para identificar 1 requisição desviada, na view ele pode ser acessado
        //usando-se ${loginflow} e assim guardalo em um campo hide

        //#2 se conseguir transferir fluxo pelo id

        //#3 ou conseguir transferir pela session DefaultLoginSession.class

        //#4 caso contrario manda para página principal

        //os método hasRetrieveRoute(loginFlowId) ou hasRetrieveRoute(sessionClass)
        //podem ser consultadas para verificar se há rota registrada no retrive para eles.

Problema de serialização corrigido. a versão ja se encontra no site do projeto.

http://code.google.com/p/access4vraptor/

link direto para o jar: http://access4vraptor.googlecode.com/files/access4VRaptor-0.0.3.jar

Parabéns amigo!
Gostei muito do código e sua funcionalidade.

Obrigado pela contribuição.

[quote=softwork]Parabéns amigo!
Gostei muito do código e sua funcionalidade.

Obrigado pela contribuição.[/quote]
Opa softwork! … vlw ai os elogios … me fala uma coisa vc chegou a usar e testar o plug-in ??

t+

Lavieri, não quer colocar esse plugin no vraptor-contrib, por favor?

pode ser em outro repositório do git, daí eu adiciono como submodulos