Demoiselle 2 + Rasea
Este post é dedicado a você que procura uma solução prática e simples para controle de acesso de sua aplicação. Para quem ainda não conhece o framework Demoiselle, recomendo a leitura do artigo Teoria e Prática com o Demoiselle 2.1. Para saber mais detalhes sobre o projeto Rasea, leia Rasea na Revista Tema. Agora vamos por a mão na massa!
Fazer o controle de acesso com o Demoiselle 2.1 é muito fácil, certo? Para ficar melhor integramos os dois projeto. Vou mostrar como fiz para aproveitar esta regalia.
O primeiro passo foi criar o projeto utilizando o arquétipo demoiselle-jsf-jpa versão 2.1.2. Se você não faz idéia do que é isto, leia Iniciando com o Demoiselle 2.0. Se você já usa o Demoiselle 2 no seu projeto, pule para a próxima etapa.
Em seguida abri o arquivo pom.xml e acrescentei a referência ao repositório de artefatos Rasea na tag <repositories>:
<repository> <id>repo.rasea.org</id> <name>Rasea Maven Repository</name> <url>http://repo.rasea.org/maven2/</url> </repository>
Ainda no pom.xml incluí a dependência para o agente Rasea na tag <dependencies>:
<dependency> <groupId>org.rasea</groupId> <artifactId>rasea-agent-demoiselle</artifactId> <version>0.1.0.Final</version> </dependency>
Criei o arquivo rasea-agent.properties na pasta src/main/resources para indicar ao agente o endereço do servidor e o modo de operação. Apontei para a instância pública de demonstração do Rasea. Optei pelo modo de carga (mode=load) para ativar o cadastro automático no servidor:
protocol=http host=demo.rasea.org port=80 context=/ mode=load
Defini o nome demoiselle-sample-webapp no arquivo demoiselle.properties para identificar minha aplicação no servidor. Se você estiver executando estes passos, invente uma identificação para sua aplicação ao invés de usar a minha.
frameworkdemoiselle.application.name=demoiselle-sample-app
Logo em seguida estabeleci as restrições de acesso à aplicação. Acrescentei a anotação @RequiredPermission nos métodos da classe BookmarkEditMB. Isto pode ser feito em qualquer outra classe injetável.
...
@RequiredPermission(resource = "favoritos", operation = "excluir")
public String delete() {
...
}
...
@RequiredPermission(resource = "favoritos", operation = "inserir")
public String insert() {
...
}
...
@RequiredPermission(resource = "favoritos", operation = "atualizar")
public String update() {
...
}
...
@RequiredPermission(resource = "favoritos", operation = "vizualizar")
protected void handleLoad() {
...
}
Criei a tela login.xhtml na pasta src/main/weabapp para possibilitar a autenticação do usuário:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
template="/template/main.xhtml">
<ui:define name="body">
<h:form>
<h:panelGrid columns="2">
<h:outputLabel for="username" value="login" />
<h:inputText id="username" value="#{credential.username}" />
<h:outputLabel for="password" value="senha" />
<h:inputSecret id="password" value="#{credential.password}" />
<h:commandButton value="Logar" action="#{securityContext.login}" />
</h:panelGrid>
</h:form>
</ui:define>
</ui:composition>
Acessei a instância de SecurityContext via EL #{securityContext.login}, que oferece funcionalidades para controle de acesso. Seja criativo e utilize-as para desabilitar botões ou esconder regiões específicas da tela
Rodei a aplicação no JBoss AS 6, naveguei pela aplicação até chegar à tela de edição. Até então não passei por nenhuma checagem de segurança.
Ao clicar no botão “salvar” um dos métodos anotados com @RequiredPermission foi invocado. O Demoiselle redirecionou a requisição para a tela de autenticação. Utilizei o login “rasea” e a senha “rasea”.
Em seguida criei um novo registro e depois excluí, forçando a chamada aos demais métodos com acesso restrito.
Acessei a instância de demonstração do servidor em http://demo.rasea.org. Novamente informei o login ”rasea” e a senha “rasea”.
Olha só que belezura, tudo cadastrado automaticamente graças ao modo de carga automática!
Caramba, este post já está muito extenso! Caso necessite, sinta-se à vontade para buscar mais informações no guia de referência oficial.
O código-fonte produzido neste exemplo está disponível no GitHub neste endereço. Para visualizar as modificações que fiz na aplicação padrão clique aqui. Para conhecer melhor o mecanismo de controle de acesso do Demoiselle 2 leia isto. E para rodar sua própria instância do servidor Rasea veja isto.
Não esqueça que este agente não limita-se a aplicações Web, ok?! Valeu e até o próximo post
Filed under: Post | 10 Comentários
Tags:Demoiselle, Rasea, Software Livre












Deu erro rodando no tomcat:
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [RaseaAgentConfig] with qualifiers [@Default] at injection point [[field] @Inject private org.rasea.agent.demoiselle.internal.producer.MaintenanceProducer.config]
mesmo problema do William
Problem solved!
A versão do arquétipo atual é a 2.2.1. Eu troquei a vesão do parent no pom.xml para a 2.1.2 que a que o Cleverson usou!
Sugestão aceita e aprovada. Valeu @WilliamBorgesc
Cleverson eu consigo levantar o servidor do Rasea no jboss 6.0.0 final?
Dá uma olhada neste post: http://cleversonsacramento.com/2011/06/12/olha-como-e-facil-rodar-o-rasea/
Mas parece haver uma incompatibilidade da versão do Prime Faces que o Rasea Server usa com o JBoss AS6. O projeto aceita contribuições para atualizá-lo
Cleverson eu vi que o rasea está funcionando somente até a versão 2.1.2, porem estou criando uma aplicação demoiselle-jpa-jsf na versão 2.2.2 e estou tentando voltar para a 2.1.2 pelo pom.xml mas dá erros, na verdade eu gostaria de saber se vai sair logo uma correção para usar na versão 2.2.2.? Grato.
Olá Jackson,
Acabei de fazer algumas modificações no agente para ficar compatível com a versão 2.2 do Demoiselle. As modificações foram estão listadas aqui:
https://github.com/rasea/demoiselle-agent/commit/04b6adf70167452922134ff6145a3242dc112d24
Liberei uma versão temporária do rasea-agent-demoiselle para que você possa experimentar: 0.1.1.Final-SNAPSHOT
Por favor, verifique se funciona com o Demoiselle 2.1 e 2.2 e posta aí um feedback para que eu possa gerar a versão definitiva. Valeu!
Cleverson, realizei os teste nas versões 2.2.1 e 2.2.2 e não funcionou. segue erro apresentado: 09:04:18,971 ERROR [org.jboss.kernel.plugins.dependency.AbstractKernelController] Error installing to Start: name=vfs:///C:/Users/marcelmorais/Java/workspace/.metadata/.plugins/org.jboss.ide.eclipse.as.core/JBoss_6.x_Runtime_1_Server1337179722113/deploy/sgpex.war_WeldBootstrapBean state=Create: org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [RaseaAgentConfig] with qualifiers [@Default] at injection point [[field] @Inject private org.rasea.agent.demoiselle.internal.producer.AuthorizerStrategyProducer.agentConfig]
at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:305) [:6.0.0.Final]
at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:139) [:6.0.0.Final]
at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:162) [:6.0.0.Final]
at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:377) [:6.0.0.Final]
at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:363) [:6.0.0.Final]
at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:388) [:6.0.0.Final]
at org.jboss.weld.integration.deployer.env.helpers.BootstrapBean.boot(BootstrapBean.java:92) [:6.0.0.Final]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.6.0_32]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) [:1.6.0_32]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) [:1.6.0_32]
at java.lang.reflect.Method.invoke(Unknown Source) [:1.6.0_32]
at org.jboss.reflect.plugins.introspection.ReflectionUtils.invoke(ReflectionUtils.java:60) [jboss-reflect.jar:2.2.0.GA]
at org.jboss.reflect.plugins.introspection.ReflectMethodInfoImpl.invoke(ReflectMethodInfoImpl.java:168) [jboss-reflect.jar:2.2.0.GA]
at org.jboss.joinpoint.plugins.BasicMethodJoinPoint.dispatch(BasicMethodJoinPoint.java:66) [jboss-reflect.jar:2.2.0.GA]
at org.jboss.kernel.plugins.dependency.KernelControllerContextAction$JoinpointDispatchWrapper.execute(KernelControllerContextAction.java:257) [jboss-kernel.jar:2.2.0.GA]
at org.jboss.kernel.plugins.dependency.ExecutionWrapper.execute(ExecutionWrapper.java:47) [jboss-kernel.jar:2.2.0.GA]
at org.jboss.kernel.plugins.dependency.KernelControllerContextAction.dispatchExecutionWrapper(KernelControllerContextAction.java:125) [jboss-kernel.jar:2.2.0.GA]
at org.jboss.kernel.plugins.dependency.KernelControllerContextAction.dispatchJoinPoint(KernelControllerContextAction.java:72) [jboss-kernel.jar:2.2.0.GA]
at org.jboss.kernel.plugins.dependency.LifecycleAction.installActionInternal(LifecycleAction.java:202) [jboss-kernel.jar:2.2.0.GA]
at org.jboss.kernel.plugins.dependency.InstallsAwareAction.installAction(InstallsAwareAction.java:54) [jboss-kernel.jar:2.2.0.GA]
at org.jboss.kernel.plugins.dependency.InstallsAwareAction.installAction(InstallsAwareAction.java:42) [jboss-kernel.jar:2.2.0.GA]
at org.jboss.dependency.plugins.action.SimpleControllerContextAction.simpleInstallAction(SimpleControllerContextAction.java:62) [jboss-dependency.jar:2.2.0.GA]
at org.jboss.dependency.plugins.action.AccessControllerContextAction.install(AccessControllerContextAction.java:71) [jboss-dependency.jar:2.2.0.GA]
at org.jboss.dependency.plugins.AbstractControllerContextActions.install(AbstractControllerContextActions.java:51) [jboss-dependency.jar:2.2.0.GA]
at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:379) [jboss-dependency.jar:2.2.0.GA]
at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:2044) [jboss-dependency.jar:2.2.0.GA]
at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:1083) [jboss-dependency.jar:2.2.0.GA]
at org.jboss.dependency.plugins.AbstractController.executeOrIncrementStateDirectly(AbstractController.java:1322) [jboss-dependency.jar:2.2.0.GA]
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1246) [jboss-dependency.jar:2.2.0.GA]
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1139) [jboss-dependency.jar:2.2.0.GA]
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:939) [jboss-dependency.jar:2.2.0.GA]
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:654) [jboss-dependency.jar:2.2.0.GA]
at org.jboss.deployers.plugins.deployers.DeployersImpl.change(DeployersImpl.java:1983) [:2.2.0.GA]
at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:1076) [:2.2.0.GA]
at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:679) [:2.2.0.GA]
at org.jboss.system.server.profileservice.deployers.MainDeployerPlugin.process(MainDeployerPlugin.java:106) [:6.0.0.Final]
at org.jboss.profileservice.dependency.ProfileControllerContext$DelegateDeployer.process(ProfileControllerContext.java:143) [:0.2.2]
at org.jboss.profileservice.dependency.ProfileDeployAction.deploy(ProfileDeployAction.java:151) [:0.2.2]
at org.jboss.profileservice.dependency.ProfileDeployAction.installActionInternal(ProfileDeployAction.java:94) [:0.2.2]
at org.jboss.kernel.plugins.dependency.InstallsAwareAction.installAction(InstallsAwareAction.java:54) [jboss-kernel.jar:2.2.0.GA]
at org.jboss.kernel.plugins.dependency.InstallsAwareAction.installAction(InstallsAwareAction.java:42) [jboss-kernel.jar:2.2.0.GA]
at org.jboss.dependency.plugins.action.SimpleControllerContextAction.simpleInstallAction(SimpleControllerContextAction.java:62) [jboss-dependency.jar:2.2.0.GA]
at org.jboss.dependency.plugins.action.AccessControllerContextAction.install(AccessControllerContextAction.java:71) [jboss-dependency.jar:2.2.0.GA]
at org.jboss.dependency.plugins.AbstractControllerContextActions.install(AbstractControllerContextActions.java:51) [jboss-dependency.jar:2.2.0.GA]
at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:379) [jboss-dependency.jar:2.2.0.GA]
at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:2044) [jboss-dependency.jar:2.2.0.GA]
at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:1083) [jboss-dependency.jar:2.2.0.GA]
at org.jboss.dependency.plugins.AbstractController.executeOrIncrementStateDirectly(AbstractController.java:1322) [jboss-dependency.jar:2.2.0.GA]
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1246) [jboss-dependency.jar:2.2.0.GA]
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1139) [jboss-dependency.jar:2.2.0.GA]
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:939) [jboss-dependency.jar:2.2.0.GA]
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:654) [jboss-dependency.jar:2.2.0.GA]
at org.jboss.profileservice.dependency.ProfileActivationWrapper$BasicProfileActivation.start(ProfileActivationWrapper.java:190) [:0.2.2]
at org.jboss.profileservice.dependency.ProfileActivationWrapper.start(ProfileActivationWrapper.java:87) [:0.2.2]
at org.jboss.profileservice.dependency.ProfileActivationService.activateProfile(ProfileActivationService.java:215) [:0.2.2]
at org.jboss.profileservice.dependency.ProfileActivationService.activate(ProfileActivationService.java:159) [:0.2.2]
at org.jboss.profileservice.AbstractProfileService.activateProfile(AbstractProfileService.java:154) [:0.2.2]
at org.jboss.system.tools.ProfileServiceToolsFacade.addURI(ProfileServiceToolsFacade.java:233) [:6.0.0.Final]
at org.jboss.system.tools.LegacyDeploymentScannerAdapter.addURL(LegacyDeploymentScannerAdapter.java:140) [:6.0.0.Final]
at org.jboss.system.tools.DeploymentScanner.addURL(DeploymentScanner.java:91) [:6.0.0.Final]
at org.jboss.system.tools.DeploymentScanner.addURL(DeploymentScanner.java:83) [:6.0.0.Final]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.6.0_32]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) [:1.6.0_32]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) [:1.6.0_32]
at java.lang.reflect.Method.invoke(Unknown Source) [:1.6.0_32]
at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:157) [:6.0.0.GA]
at org.jboss.mx.server.Invocation.dispatch(Invocation.java:96) [:6.0.0.GA]
at org.jboss.mx.server.Invocation.invoke(Invocation.java:88) [:6.0.0.GA]
at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:271) [:6.0.0.GA]
at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:670) [:6.0.0.GA]
at org.jboss.system.server.jmx.MBeanServerWrapper.invoke(MBeanServerWrapper.java:138) [:6.0.0.Final (Build SVNTag:JBoss_6.0.0.Final date: 20101228)]
at javax.management.remote.rmi.RMIConnectionImpl.doOperation(Unknown Source) [:1.6.0_32]
at javax.management.remote.rmi.RMIConnectionImpl.access$200(Unknown Source) [:1.6.0_32]
at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(Unknown Source) [:1.6.0_32]
at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(Unknown Source) [:1.6.0_32]
at javax.management.remote.rmi.RMIConnectionImpl.invoke(Unknown Source) [:1.6.0_32]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.6.0_32]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) [:1.6.0_32]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) [:1.6.0_32]
at java.lang.reflect.Method.invoke(Unknown Source) [:1.6.0_32]
at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source) [:1.6.0_32]
at sun.rmi.transport.Transport$1.run(Unknown Source) [:1.6.0_32]
at java.security.AccessController.doPrivileged(Native Method) [:1.6.0_32]
at sun.rmi.transport.Transport.serviceCall(Unknown Source) [:1.6.0_32]
at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source) [:1.6.0_32]
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source) [:1.6.0_32]
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source) [:1.6.0_32]
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) [:1.6.0_32]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [:1.6.0_32]
at java.lang.Thread.run(Unknown Source) [:1.6.0_32]
Cleverson, pretente lançar uma nova versão do agente pra versão 2.2.2?