posta aqui vai ajudar !
Alguém sabe se o tutorial já foi postado?
não foi nao !
segue arquivo SACI atualizado e classes modelo
Outro arquivo
Configuração Web.xml
<context-param>
<param-name>br.com.caelum.vraptor.packages</param-name>
<param-value>
br.com.caelum.vraptor.converter.l10n,
br.com.caelum.vraptor.util.hibernate,
br.com.bronx.vraptor.saci <!-- ESTA LINHA QUE É NECESSÁRIA -->
</param-value>
</context-param>
transcrevo abaixo as orientações que o Bronx me passou:
o AccessControllerInterceptor
entao, olha o construtor dele
public AccessControllerInterceptor(UsuarioCorrente usuarioCorrente, RestrictionChecker restrictionChecker,
Result result){
ele recebe um Result que vc já conhece
recebe um RestrictionChecker. Esse RestrictionChecker está no jar que te mandei (isto é, Saci)
é essa classe que verifica se há ou não restrições então por isso precisamos dela e
por último a classe UsuarioCorrente
ela é uma implementação simples de um componente SessionScoped que guarda na sessão o usuário logado no sistema então quando vc a recebe, vc está recebendo o usuário logado
mas isso não tem nenhuma relação com o restritor, vc pode fazer diferente.
Então se vc olhar a UsuarioCorrente verá que ele simplesmente guarda o usuário na sessão nada d+
Faça do jeito que for conveniente…essas classes eu uso no projeto de teste do restritor, então estão bem simples hehe
Voltemos ao interceptor o método accepts dele o objeto restrictionChecker simplesmente verifica se o recurso (classe/método) que está sendo acessado possui ou não restrições
se não possuir, não há motivo para verificar se o usuário pode ou não acessá-la
Caso haja restrição, ele vai interceptar novamente esse interceptor é só uma implementação vc pode alterá-lo de acordo com as necessidades por exemplo, se quiser que ele verifique as restrições em todas as requisições, só retornar true no accept
e por aí vai
apenas pra revisar:
- configurar web.xml
- vc tem que ter um perfil como vc vai obter esse perfil, isso já é problema seu
essa classe usuariocorrente que fiz foi a minha implementação para fazer os testes aqui
confesso que nos sistemas aqui fazemos algo parecido, mas não é uma regra…vc pode buscar o perfil de onde quiser, sacou?
aí no método intercept
vc invoca o método checkRestrictions da classe restrictionChecker
vc passa como parâmetro o método em questão, e o tal do perfil do usuário
que nada mais é que uma implementação da interface Profile que está no jar
right?
as anotações de restriões foram alteradas?
As anotações
@LoginPage
essa vc usa no método da página de login o método nao pode receber parâmetros (taí uma futura melhoria) mas não confunda com o método referente ao action do form é só o método que mostra a página de login mesmo
@AccessDeniedPage
essa vc coloca sobre o método da página onde vc quer que o usuário seja redirecionado, caso tente acessar um recurso sem possuir as credenciais necessárias
bom, agora sim, acabaram-se as configurações
essas informações são checadas durante o startup da aplicação
então agora, é começar a colocar as restrições nos recursos
@LoggedIn -> somente usuários logados
@Roles(roles = {…}) -> somente usuários que possuírem todas as roles (ou apenas uma dentre as informadas - vai da configuração)
@AccessLevel ->> utilizado para restrições hierárquicas
tipo @AccessLevel(minimumAccessLevel = 4)
logo, um usuário com nível de acesso 3 não conseguiria acessar o recurso mas usuários com níveis 4, 5, 6 etc conseguiriam esse é mais chato, mas confesso que nunca precisei utilizá-lo
e onde colocar o nivel de acesso?
justamente no perfil
vc pode fazer do jeito que quiser aí o importante é a interface, não a implementação vc só tem que passar um Profile para o checkRestrictions
RESUMO:
- configurar web.xml
- ter uma lista de perfis em algum lugar
- definir pagina de erro e pagina de login (no controller)
- anotar os metodos com as "restrições"
só esse "ter uma lista de perfis" que ficou meio vago
eu trocaria por "implementar a interface Profile"
tem outras duas anotações importantes
@OnAccessDenial(forceHttp403 = true)
ela indica que, em caso de acesso negado, ao invés de redirecionar para a página que vc anotou com @AccessDenied, ele simplesmente retorna o código http 403
isso é muito útil em chamadas ajax
@CascadeRestrictions(cascade = false)
é para alterar o comportamento do restritor ele funciona assim vc pode utilizar as restrições na classe e nos métodos o comportamento padrão dele é o seguinte: tem que satisfazer TODAS as restrições - as da classe e do método por exemplo
@Resource
@Roles(roles = "professor")
class ExemploController {
public void areaProfessor(){}
}
nesse caso, somente professores conseguem acessar o método areaProfessor mas
pode ter a seguinte situação
@Resource
@Roles(roles = "professor")
class ExemploController {
public void areaProfessor(){}
public void areaSomenteProfessoresDoutores(){}
}
além da área de professor, tem uma área que só pode ser acessada por doutores aqui já dá pra ver que vai dar problema pq do jeito que está um professor consegue acessar os dois métodos pois a única restrição é essa: que seja professor (role = "professor")
logo, temos que restringir mais ainda …
então tem que anotar o metodo? isso!
@Resource
@Roles(roles = "professor")
class ExemploController {
public void areaProfessor(){}
@Roles(roles = "doutor")
public void areaSomenteProfessoresDoutores(){}
}
neste caso qual a anotação mandatoria (que prevalece)?
então esse é o ponto as duas prevalecem!o cara vai ter que ser doutor E professor
entendi. há uma combinação (E), ok …
isso caso queira mudar esse comportamento aí entra aquela anotação acima
[code
@CascadeRestrictions(cascade = false)
[/code]
se quiser que seja acessado por qualquer doutor…
isso
ficaria assim
@Resource
@Roles(roles = "professor")
class ExemploController {
public void areaProfessor(){}
@Roles(roles = "doutor")
@CascadeRestrictions(cascade = false)
public void areaSomenteProfessoresDoutores(){}
}
agora, basta ele ser doutor pq agora o que prevalece é a restrição do método
só pra concluir suponhamos que há tbm, no mesmo controller, uma área onde somente MESTRES possam acessar
@Resource
@Roles(roles = "professor")
class ExemploController {
public void areaProfessor(){}
@Roles(roles = "doutor")
@CascadeRestrictions(cascade = false)
public void areaSomenteDoutores(){}
@Roles(roles = "mestre")
@CascadeRestrictions(cascade = false)
public void areaSomenteMestres(){}
}
certo?
sim.
podemos melhorar isso olha agora
@Resource
@Roles(roles = "professor")
@CascadeRestrictions(cascade = false)
class ExemploController {
public void areaProfessor(){}
@Roles(roles = "doutor")
public void areaSomenteDoutores(){}
@Roles(roles = "mestre")
public void areaSomenteMestres(){}
//outros métodos/recursos
}
o que eu fiz foi simplesmente tirar a anotação @Cascade… de cada método e coloquei somente uma direto na classe isso significa que agora, para qualquer método que possuir restrição específica, o restritor não desconsidera a restrição que está na classe
e nos métodos que não possuírem restrições específicas, use a restrição da classe
bem, é isso
----------- FIM da conversa com o Bronks
Pq sempre escrevem “BronKS”?? hehehe
Piadas à parte, acho que ficou claro como fazer a parada funcionar!
Só falta eu colocar no git…
Bronx precida de um Demo !
Posta la !
Muito obrigado pela sua contribuição, será de grande ajuda para mim…
No meu caso os usuarios que não tem acesso a determinadas partes da aplicação não poderão nem ver os links das páginas… Alguém pode me ajudar?
Senhores, fiquem atentos às novidades: http://www.guj.com.br/java/238655-saci---simple-access-controller-vraptor-3
Olá Boa tarde a Todos,
Galera estou com um pequeno problema, a alguns dias comecei a trabalhar com o VRaptor e antes de encontrar o projeto do Bronx estava criando os Interceptors e
trabalhando com o login de usuário através de Anotações simples que criei para dizer oque era publico e o que exigia login.
Achei o projeto do Bronx muito legal e comecei a implementar com ele aqui durante a tentativa de execução obtive o seguinte erro:
13:59:38,210 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/doku].[default]] (http--0.0.0.0-80-1) Servlet.service() for servlet default threw exception: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'accessControllerInterceptor': Unsatisfied dependency expressed through constructor argument with index 1 of type [br.com.bronx.accesscontrol.restriction.RestrictionChecker]: : No matching bean of type [br.com.bronx.accesscontrol.restriction.RestrictionChecker] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [br.com.bronx.accesscontrol.restriction.RestrictionChecker] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:730) [org.springframework.beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:196) [org.springframework.beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1003) [org.springframework.beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:907) [org.springframework.beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485) [org.springframework.beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) [org.springframework.beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:329) [org.springframework.beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:43) [org.springframework.web-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:325) [org.springframework.beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) [org.springframework.beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:263) [org.springframework.beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1083) [org.springframework.context-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.instanceFor(SpringBasedContainer.java:86) [vraptor-3.4.1.jar:]
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:47) [vraptor-3.4.1.jar:]
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) [vraptor-3.4.1.jar:]
at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83) [vraptor-3.4.1.jar:]
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) [vraptor-3.4.1.jar:]
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) [vraptor-3.4.1.jar:]
at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48) [vraptor-3.4.1.jar:]
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) [vraptor-3.4.1.jar:]
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) [vraptor-3.4.1.jar:]
at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71) [vraptor-3.4.1.jar:]
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) [vraptor-3.4.1.jar:]
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) [vraptor-3.4.1.jar:]
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56) [vraptor-3.4.1.jar:]
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) [vraptor-3.4.1.jar:]
at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69) [vraptor-3.4.1.jar:]
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) [vraptor-3.4.1.jar:]
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) [vraptor-3.4.1.jar:]
at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44) [vraptor-3.4.1.jar:]
at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91) [vraptor-3.4.1.jar:]
at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58) [vraptor-3.4.1.jar:]
at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88) [vraptor-3.4.1.jar:]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.13.Final.jar:]
at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.13.Final.jar:]
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.13.Final.jar:]
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.13.Final.jar:]
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:]
at java.lang.Thread.run(Thread.java:662) [rt.jar:1.6.0_29]
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [br.com.bronx.accesscontrol.restriction.RestrictionChecker] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:920) [org.springframework.beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:789) [org.springframework.beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703) [org.springframework.beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:795) [org.springframework.beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:723) [org.springframework.beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
... 46 more
Será que alguem poderia me ajudar não estou conseguindo perceber a causa da exception
No matching bean of type [br.com.bronx.accesscontrol.restriction.RestrictionChecker]
talvez vc precise criar uma implementação dessa interface e anotar com @Component.
Muito obrigado,
Resolveu!!
Bom aproveitando, obtive outro erro
na verdade quando eu coloco a anotação
ele simplesmente não direciona nem para a tela de login nem para 403
continua dando acesso a pagina como se não houvesse problema nenhum.
para demonstrar como esta vide o código abaixo:
//Trecho do classe Resource que possui o direcionamento da página principal
@LoggedIn
@Get("/")
public void index(){
}
Na minha pagina quando colocamos aplicacao/
ele direciona para este metodo
Então suspeitei da minha implementação de Profile que esta assim
@Override
public boolean isLoggedIn() {
if(this.usuario != null)
return true;
else
return false;
}
Não sei porque ele não direciona para o login,
ou porque não da pelo menos um erro
Olá, aquila.venancio!
O RestrictionChecker já é um componente devidamente configurado.
Qual versão do jar você está utilizando? Pois desde a última versão (de maio do ano passado), você sequer precisa criar um interceptor. Já tem tudo pronto lá!
Acho que o problema está na configuração. Nos mostre como está o seu web.xml!
Aqui tem as explicações detalhadas de como configurar tudo certinho!
Pois é Bronx,
eu vi a data dos post mas comecei mexer com o VRaptor agora e pesquisando sobre controle de acesso encontrei o seu projeto.
Estava utilizando a versão antes de ter nome como primeiro jar quando li as 12 páginas de discursão do forum encontrei seu link indicando a versão atual SACI
só que estava utilziando a versão mais antiga logo a sugestão do Lucas Cavalcanti veio acalhar.
Agora que li a documentação do seu pequeno framework de segurança estou conseguindo caminhar com velocidade um pouco maior,
porem volta e meia aparece uns exception meio tensos aqui.
Mas a informação esta bem legal esta dando para descobrir a causa.
de qualquer forma ai vai o xml.
<filter>
<filter-name>vraptor</filter-name>
<filter-class>br.com.caelum.vraptor.VRaptor</filter-class>
</filter>
<filter-mapping>
<filter-name>vraptor</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
<param-value>messages</param-value>
</context-param>
<context-param>
<param-name>br.com.caelum.vraptor.packages</param-name>
<param-value> br.com.bronx.vraptor.saci</param-value>
</context-param>