Minha contribuição - Controle de acesso VRaptor 3

Muito boa a contribuição. Porém não vamos esquecer que no Java há uma API para autenticação e autorização que é o JAAS, que te permite plugar diversos mecanismos para isso. Além de que você não precisa implementar nada na sua aplicação, apenas configurar o container para tal. Com ele é possível controlar tanto a autenticação quanto a autorização necessária para acesso aos recursos.

Só tenho duas sugestões: usar um pouco mais do convention-over-configuration evitando usar tantas anotações e configurações unificadas. Achei um pouco desnecessário usar uma anotação para dizer onde vai quando o usuário não estiver autenticado. Ele sempre deverá ir para a tela de login.

Abraços

O seu loginPage e accessDeniedPage estão apontando para o mesmo local. Is that right?? ^^
Além disso, não precisa utilizar a annotation @LoggedIn. Como o cara precisa ser um admin, ele tem que estar logado para que se possa saber quais roles ele possui. A ferramenta já faz essa verificação.

[quote=garcia-jj]Muito boa a contribuição. Porém não vamos esquecer que no Java há uma API para autenticação e autorização que é o JAAS, que te permite plugar diversos mecanismos para isso. Além de que você não precisa implementar nada na sua aplicação, apenas configurar o container para tal. Com ele é possível controlar tanto a autenticação quanto a autorização necessária para acesso aos recursos.

Só tenho duas sugestões: usar um pouco mais do convention-over-configuration evitando usar tantas anotações e configurações unificadas. Achei um pouco desnecessário usar uma anotação para dizer onde vai quando o usuário não estiver autenticado. Ele sempre deverá ir para a tela de login.

Abraços[/quote]

Opa!
Então garcia-jj, esse esquema é específico para o VRaptor. Vale lembrar que nem todos usuários do VRaptor conhecem ou sabem utilizar o JAAS (eu mesmo nem imagino como funciona…=S). Qualquer Servlet Container possui suporte a JAAS?
Agora fiquei curioso: vc utiliza JAAS com o VRaptor? É simples? Vou dar uma estudada ASAP.

Quanto ao CoC: concordo.
Tanto que estamos justamente elaborando uma solução mais simples para não termos que fazer essas configurações em todas as classes/métodos do sistema. A idéia do loginPage é dar o máximo de flexibilidade ao desenvolvedor. Pode existir uma situação onde, antes de ir para a página de login, ele queira exibir alguma informação ao usuário, por exemplo (??? sei lá rs). Mas de qualquer modo, é essa linha que pretendemos adotar: a menor quantidade de configurações possíveis.

Valeu pela contribuição. Será de grande valia!!

[quote=bronx]O seu loginPage e accessDeniedPage estão apontando para o mesmo local. Is that right?? ^^
Além disso, não precisa utilizar a annotation @LoggedIn. Como o cara precisa ser um admin, ele tem que estar logado para que se possa saber quais roles ele possui. A ferramenta já faz essa verificação. [/quote]

Na verdade o código que estou testando é assim:

Tentei das duas formas e a excessão lançada é a mesma. De noite vou testar a solução com o HttpServletResponse e te aviso!

Nice.

Acho que até a noite eu posto o que fiz para que funcionasse com o Result.

Abs, e valeu pela força!

[quote=sobreira][quote=bronx]O seu loginPage e accessDeniedPage estão apontando para o mesmo local. Is that right?? ^^
Além disso, não precisa utilizar a annotation @LoggedIn. Como o cara precisa ser um admin, ele tem que estar logado para que se possa saber quais roles ele possui. A ferramenta já faz essa verificação. [/quote]

Na verdade o código que estou testando é assim:

Tentei das duas formas e a excessão lançada é a mesma. De noite vou testar a solução com o HttpServletResponse e te aviso![/quote]

sobreira,

Use “…” antes da URI. Assim:

De qualquer forma, teste com o HttpServletResponse e poste os resultados! :wink:

Abs!

[quote=sobreira][quote=bronx]O seu loginPage e accessDeniedPage estão apontando para o mesmo local. Is that right?? ^^
Além disso, não precisa utilizar a annotation @LoggedIn. Como o cara precisa ser um admin, ele tem que estar logado para que se possa saber quais roles ele possui. A ferramenta já faz essa verificação. [/quote]

Na verdade o código que estou testando é assim:

Tentei das duas formas e a excessão lançada é a mesma. De noite vou testar a solução com o HttpServletResponse e te aviso![/quote]

vc tá usando qual versão do VRaptor?

na mais nova, a 3.1, não dá mais essa exceção forçando usar redirect via método…
http://tinyurl.com/vr3dw

[quote=Lucas Cavalcanti]vc tá usando qual versão do VRaptor?

na mais nova, a 3.1, não dá mais essa exceção forçando usar redirect via método…
http://tinyurl.com/vr3dw[/quote]

Estava com a 3.02. Atualizado e resolvido. Obrigado Lucas!

BRONX BOM DIA !


   @LoggedIn  
   @Roles(roles="admin")  
   @AccessDenied(loginPage="/user/accessDenied", accessDeniedPage="/user/accessDenied")  
   public List<User> list() {  
       return dao.list();  
 }  

ESSE admin, pode ser um valor do banco ? tipo admin/pesquisa/relatorio/edição/etc… ?

SIM!

Leia a segunda mensagem do Bronx que ela explica isso. Examine o exemplo da classe Usuario que ele enviou, e veja que o role é capturado pelo método: public List<String> getRoles(); da Interface Profile.

Persistir estes dados é simples. Na sexta mensagem deste mesmo tópico eu questiono isso e na sétima o Bronx mostra uma alternativa. É só ler e decidir como fazer.

sobreira Bom dia !

Otimo, tu já fez isso ?

Sim.

Criei uma @Entity chamda Roles. Fiz um mapeamento @OneToMany na classe Usuario para esta @Entity e segui a dica do Bronx pra mapear meu Set<Roles> para o List<Strings> retornado pelo public List<String> getRoles(); da minha classe Usuario. É realmente bem simples.

sobreira !

Poderia enviar as classes para eu da uma olhada ? web2ajax@gmail.com

Abraço !

E ae galera!

sobreira, como foram os testes? Funcionou? O que achou? Sugestões?
Alguém mais testou a parada? yorgan?
Dêem suas opiniões!!

Lucas,
Ontem quebrei a cabeça com o github. Na real, fiquei pouco mais de meia hora mexendo, e confesso que não entendi como a ferramenta funciona.
Mas para todos os efeitos, acho que amanhã farei algumas alterações. Criarei os métodos setDefaultLoginPage e setDefaultAccessDeniedPage, para facilitar enquanto a ferramenta ainda não estiver integrada ao VRaptor (se isso for rolar mesmo…=S), além de deixar o roles como uma lista de String e anotar o RestrictionChecker com o @Component!

E o nome? Vou alterar os pacotes para br.com.bronx.restrictrex. Alguma objeção? Ou sugestão? Rss

E por favor: TESTEM! Mais de 600 visualizações e só 2 pessoas demonstraram que realmente estão testando…=/

Abs a todos!

[quote=bronx]E ae galera!

sobreira, como foram os testes? Funcionou? O que achou? Sugestões?
Alguém mais testou a parada? yorgan?
Dêem suas opiniões!![/quote]
Tava mexendo aqui, mas to caindo de sono. Como disse anteriormente gostei muito da solução e até agora está tudo ok. As funcionalidades que você apresentou estão funcionando 100%. Tive apenas um probleminha mas foi por conta da versão do vraptor que estava usando.

Estou ansioso pra pegar o projeto no Github e fazer um fork!

[]s

sobreira To No Aguardo !

show de bola !!!

eu já estava começando a fazer algo neste sentido http://www.guj.com.br/posts/preList/149082/809422.java#809422

apoio a sugestão do Lucas de fazer a configuração do loginPage e accessDeniedPage uma unica vez.

na prox semana vou retomar meus estudos em vraptor e então podemos trocar idéias

parabéns pela iniciativa.

a propósito,

vc já definiu o tipo de licença? Apache, GLP , LGLP, …

posso usar, complementar, alterar ?

[quote=ricardosoares]show de bola !!!

eu já estava começando a fazer algo neste sentido http://www.guj.com.br/posts/preList/149082/809422.java#809422

apoio a sugestão do Lucas de fazer a configuração do loginPage e accessDeniedPage uma unica vez.

na prox semana vou retomar meus estudos em vraptor e então podemos trocar idéias

parabéns pela iniciativa.

[/quote]

Excelente, ricardosoares!

Quanto mais pessoas estiverem participando, melhor!

Prometo que hj a noite, mais tardar amanhã cedo, posto nova versão com a centralização das configurações de loginPage e accessDeniedPage.

A idéia do Lucas de anotar os próprios recursos com @LoginPage e @AccessDeniedPage é sensacional! Mas acredito que isso só seria possível se a ferramenta estivesse integrada ao VRaptor.

Quanto a licença: ainda não pensei a respeito.
Essa é a minha primeira contribuição em um projeto open-source, então tenho que dar uma estudada nas licenças disponíveis, suas peculiaridades etc.
Tenho inclusive que conversar com o Lucas sobre isso, pois caso a solução seja integrada a uma versão futura do VRaptor, já assumiria a licença utilizada pelo framework.

Mas velho, a minha ideia é seguir a filosofia burger king: “HAVE IT YOUR WAY”. Rs
Pode alterar o código sem problemas. Conforme a parada andar, podemos ir agregando/melhorando cada vez mais a ferramenta.

Abs.

bronx bOA tARDE !

Eu tenho que fazer isso tudo em um futuro sistema, logo vou contribuir… mas concordo quanto mais melhor !