Archive for the ‘JBoss’ Category.

Natal chegou mais cedo (JBOSS AS 5.0 is OUT)

Depois de um longo período de hibernação (me desculpem aos que liam o blog), mas estou muito envolvido em projetos de governança SOA, espero poder blogar cedo.

Mas um evento em particular me forçou vir ao menos falar sobre ele. Saiu finalmente o JBoss AS 5.0. O que eu imaginava ser um feito quase impossível (estava imaginando quem iria sair primeiro, o AS 5.0 ou o Duke Nukem Forever ).

Bem, esta ai (http://www.jboss.org/feeds/post/jbossas_5_0_0_ga_released) JBoss AS 5.0, totalmente compativel com a spec 5.0. Com o novo VFS, com JBoss messaging e com o novo MC (nem tudo eh perfeito ne?)

Grande abraço e bons códigos

Identity Management de verdade com novo Seam 2.1 Beta

Poxa vida, tava preparando um post sobre RecordProcessor, e sai a versão nova do Jboss Seam ontem, e com ela um novo Identity Manager, e desta vez com suporte a LDAP!!!!
Bem, desta vez vou dividir em mais partes o post, nesta primeira parte vou focar apenas na configuração do Apache Directory Server (LDAP) e na autenticação com seam.

Pré requisitos:

Configurando o LDAP

Bem, o primeiro passo é criar uma aplicação com Seam, usando o bom e velho seam-gen. Veja este post para maiores informações.
Instale o Apache Directory Studio usando o update-site para eclipse e marque as opções Studio e Directory Server (isso vai lhe permitir iniciar um servidor LDAP de dentro do eclipse)

Bem, com o plugin configurado, abra a perspectiva de Servers do Directory Studio e crie um novo servidor, assim como na figura abaixo:

Servidor de LDAP do Directory Studio (clique para fullsize)

Servidor de LDAP do Directory Studio (clique para fullsize)

Inicie o servidor, clique com o botão direito sobre o mesmo, e então LDAP Browser -> New Connection. Isto vai conecta-lo ao servidor de LDAP, na aba esquerda “LDAP Browser” você pode agora criar os usuários e roles.

Bem, vamos criar uma árvore onde abaixo de nosso domain (dc), existe uma Organizational Unit (ou) para users e outra para roles.

Clique com o botão da direita em dc=example,dc=com e depois new entry. Selecione uma nova entrada e na tela de object classes “Organization Unit” e Add…

Adicionando uma OU (clique para fullsize)

Adicionando uma OU (clique para fullsize)

Na próxima tela no RDN use ou e roles como na figura abaixo:

Definindo o OU (clique para fullsize)

Definindo o OU (clique para fullsize)

Bem, agora repita este passo e crie uma ou com nome de users.

Bem, agora é preciso criar um usuário, basta seguir as telas abaixo:

Criando um usuário (clique para fullsize)

Criando um usuário (clique para fullsize)

Você deve adicionar os objetos Person e extensibleObject em sua entrada:

Adicionando extensible Object (clique para fullsize)

Adicionando extensible Object (clique para fullsize)

Na próxima tela é importante que seu DN fique da seguinte maneira : uid=$USER,ou=users,dc=example,dc=com pois esta é a string de pesquisa usada pelo componente do Seam no LDAP, então adicione apenas uid no seu RDN como na figura abaixo:

Cuidado com RDN... (clique para fullsize)

Cuidado com RDN... (clique para fullsize)

Na próxima tela você terá que adicionar dois campos a mais que são obrigatórios (CN=Common Name e SN=Surname) adicione um nome e sobrenome. Além disto, você deve adicionar um atributo member que vai apontar para o role que seu usuário participa.

Para adicionar um atributo clique no ícone mostrado na figura abaixo:

Clique no ícone em destaque (segundo da esquerda pra direita)

Clique no ícone em destaque (segundo da esquerda pra direita)

Agora escolha member:

Adicionando um member em nossa entrada (clique para fullsize)

Adicionando um member em nossa entrada (clique para fullsize)

Além disto você vai precisar de um userpassword:

Adicionando atributo userPassword

Adicionando atributo userPassword

No final, sua entrada deve se paracer com a figura abaixo:

Resultado final da entrada de um usuário (clique para fullsize)

Resultado final da entrada de um usuário (clique para fullsize)

Ok, o usuário esta configurado (a propósito, criei o usuário bob com senha bob :P )

Para cada novo role de um usuário, basta adicionar um novo atributo member para o usuário em questão

Agora podemos partir para o seam :)

Configurando o Identity Management

Configura o identityManagement é muito simples. IdentityManagement é uma classe que delega a um IdentityStore (no nosso caso LDAP), então você precisa configura o ldapIdentityStore e um security-identity-manager

Agora basta adicionar o ldapIdentityStore e security-identity-manager:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<security:ldap-identity-store name="ldapIdentityStore"
   			server-address="localhost"
   			server-port="10389"
   			user-DN-prefix="uid="
   			user-DN-suffix=",ou=users,dc=example,dc=com"
   			user-context-DN="ou=users,dc=example,dc=com"
   			user-password-attribute="userPassword"
   			role-context-DN="ou=roles,dc=example,dc=com"
   			role-DN-prefix="cn="
   			role-DN-suffix=",ou=roles,dc=example,dc=com"
   			bind-DN="uid=admin,ou=system"
   			bind-credentials="secret"
   			user-role-attribute="member"
   			user-object-classes="person,uidObject">
   </security:ldap-identity-store>
 
   <security:identity-manager identity-store="#{ldapIdentityStore}"></security:identity-manager>

Pronto, você pode inclusive remover seu authenticator agora :) O Seam cuida desta nova forma de autenticação para você.

Dos descritores acima quero falar apenas de dois pontos (ta tarde pra caralho e quero dormir :|). Bem, o server-port não existe no XSD do seam, parece ser um bug pois o componente tem o atributo e você pode usar, eu já fui fominha e abri um bug mas podem usar sem problemas. Outro ponto é o atributo enabled que quando usado (nao foi nosso caso), deve ter o valor TRUE e não true, sabe por que? Abaixo um trecho do LDAPIdentityStore

431
if (LDAP_BOOLEAN_TRUE.equals(value)) return true;

O valor LDAP_BOOLEAN_TRUE é “TRUE” ou seja, se você usar “true” minúsculo vai levar graxa na cara.

Bom, agora, quando voce acessar sua aplicação e for na tela de login, ja vai estar usando o LDAP. Não precisou mexer em xhtml, nem em classe alguma. Não é uma beleza?

Pessoal, esse post eu fiz questão de varar a noite, primeiro porque só esta feature já é um motivo para vocês usarem Seam, segundo porque sou fominha e queria postar antes de qualquer um :D

O próximo post vou continuar daqui, vou mostrar como usar o IdentityStore para adicionar users via web no LDAP (sem você escrever uma linha de código), como funciona o novo mecanismo de permissions e como mesclar LDAP e banco de dados para armazenar permissions no banco de dados.

Inté

Adeus monitoração com JBossWS

Poxa vida, essa aqui me deixou fora do sério. Então resolvi fazer um pequeno post de forma que outras pessoas que passem pelo mesmo problema possam achar uma informação relevante na web.

Bem, estou rodando o JBoss 4.2.3.GA e JBossWS 3.0.3 (sim, sou bleeding edge), e estava tudo perfeito :). Então hoje, estava na Unimed BH prestando consultoria e para fazer alguns testes modifiquei meu script de init do jboss, adicionando o parâmetro: -Dcom.sun.management.jmxremote, para poder monitorar meu jboss com jconsole. Nada mais comum no dia a dia de um desenvolvedor certo?

Ok, voltei pra casa, e fui testar a aplicação do próximo post, e do nada: uma mensagem de erro surge:

20:57:05,922 ERROR [MainDeployer] Could not start deployment: file:/java/servers/jboss-4.2.3.GA/server/default/deploy/bobsam.ear/bobsam.jar/
java.lang.NullPointerException
at org.jboss.wsf.framework.deployment.WebAppGeneratorDeploymentAspect.generatWebDeployment(WebAppGeneratorDeploymentAspect.java:104)

NullpointerException numa classe do jboss??? Que será que eu fiz de errado? Poxa, vou voltar a versão para a 3.0.2… Mesmo erro. Re-instalei a versão do jboss, peguei uma 4.2.3 novinha em folha, mesmo erro (eu rodo de dentro do eclipse…).

Então, depois de achar que era erro na minha aplicação. Resolvi rodar o jboss por fora do eclipse…. Funcionou. Opa, como assim? Funciona fora do eclipse mas quando inicio pelo eclipse não? Tem coisa errada ai. Então abri meu launch configuration e vi o parâmetro -Dcom.sun.management.jmxremote, bem, não custa tentar né? Removi o danado, e não é que funcionou… uma pequena pesquisa no google e achei:
http://jira.jboss.com/jira/browse/JBWS-1800, acho que vou ter que esperar a próxima versão para usar jconsole com JBossWS.
Bem, um pequeno post para aqueles que pretendem usar JBossWS e se depararem com este NPE.
Inté