Demoiselle 2 + Rasea

06ago11

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.

Parâmetros para criação da aplicação exemplo

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.

Tela de edição

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”.

Tela de autenticação

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”.

Tela de autenticação do Rasea

Olha só que belezura, tudo cadastrado automaticamente graças ao modo de carga automática!

Matrix de concessão de permissões

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 😉

Anúncios


10 Responses to “Demoiselle 2 + Rasea”

  1. 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]

  2. mesmo problema do William

  3. 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!

  4. Sugestão aceita e aprovada. Valeu @WilliamBorgesc

  5. Cleverson eu consigo levantar o servidor do Rasea no jboss 6.0.0 final?

  6. 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.

  7. 9 Marcel Morais Luna

    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]

  8. 10 Marcel Morais Luna

    Cleverson, pretente lançar uma nova versão do agente pra versão 2.2.2?


E aí, o que você achou? Comenta aí...

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s