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:
- JBoss Seam 2.1 BETA1
- Apache Directory Studio para eclipse
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:
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…
Na próxima tela no RDN use ou e roles como na figura abaixo:
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:
Você deve adicionar os objetos Person e extensibleObject em sua entrada:
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:
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:
Agora escolha member:
Além disto você vai precisar de um userpassword:
No final, sua entrada deve se paracer com a figura abaixo:
Ok, o usuário esta configurado (a propósito, criei o usuário bob com senha bob
)
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
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é










Sue Massey:
I found your site on Google and read a few of your other entires. Nice Stuff. I’m looking forward to reading more from you.
Thursday, August 28, 2008, 1:02admin:
Thanks Sue, I’ll have an english version of all my posts really soon! It’s just a matter of how do I use multiple languages on wordpress (still did not have the proper time to search on how to do it)
Regards
Thursday, August 28, 2008, 7:32André:
Como vai Vinícius?
Talvez vc lembre de mim. Sou o André de SP e fiz seu curso de jBPM junto com o pessoal do ABN.
Muito bom seu post.
Vou comentar sobre um aspecto relacionado ao JBoss Portal (JP), mas tb relacionado (talvez) a Identity Management. Pelo que tenho estudado, o JP só oferece os conceitos de usuários e grupos. Se vc quiser algo além disso, é necessário reimplementar os xxxxModule(s). Então, acabei dando uma olhada no Liferay e percebi que ele tem conceitos bem mais sofisticados de agrupamento de usuários como organizações, comunidades, delegação de administração, etc. (1)
Voltando ao JP, vi que os Core Developers iniciaram uma discussão para a reformulação desse conceitos (2), mas ela encerrou em agosto do ano passado com a argumentação que o JBoss SX resolveria grande parte desses problemas no AS 5.
Questões:
- Vc já usou JP?
- Vc já precisou de algo diferente para autorizar seus portlets/pages/portals?
- Será que JBoss SX resolve o problema?
Abraço e continue assim!!
Referências:
(1) http://www.liferay.com/web/guest/community/wiki/-/wiki/Main/Working%20with%20Organizations%20and%20Locations#section-Working+with+Organizations+and+Locations-InheritanceOfPermissions
(2) http://www.jboss.com/index.html?module=bb&op=viewtopic&t=112843
Friday, September 5, 2008, 10:51Eduardo:
Vinícius,
Estou tentando implementar um webservice que autentique no LDAP usando o Seam Framework. Você teria um exemplo pronto para me enviar?
Li seu post porém não consegui ter uma idéia clara de como posso aproveitar seu código para criar um webservice.
Att,
Wednesday, December 10, 2008, 8:48Eduardo
Thaigo:
e ai Vinicius, tudo bem ?
gostei bastante do post e estou iniciando um projeto Seam (até hj só li exemplos do site oficial) e precisaria de algo parecido com o que vc publicou: A AUTENTICAÇÃO deve ser via LDAP (a empresa onde trabalho já possui um servidor LDAP global para essa finalidade) mas, no entanto, o mecanismo de AUTORIZAÇÃO deve ser mantido por cada aplicação.
Sendo assim, pergunto: Como faço para autenticar via LDAP e autorizar via banco de dados ?
Att,
Wednesday, February 4, 2009, 12:51Thiago