Finalmente meu netbeans em Inglês

Enquanto o post de Identity não fica pronto (até porque tem mais bug no novo mecanismo de Permission do Seam que formigas no seu quintal), estava brincando com meu netbeans, e uma das coisas que eu gostaria de verdade amaldiçoar a comunidade Brasileira é pela tradução do netbeans. Porra meu, “Serviços Web”, vai pra ……! Então, quando você baixa o netbeans, ele automaticamente usa o default language do seu OS, não lhe dando qualquer opção de mudança. Como tenho tolerância zero para ferramentas em português, que normalmente possuem traduções porcas. Achei bacana compartilhar aqui como você muda isso, caso vocês estejam com o mesmo problema.

Basta ir ao diretório de instalação do seu netbeans, e editar o arquivo que esta em etc/netbeans.conf.
Localize a linha netbeans_default_options= e adicione: -J-Duser.language=en -J-Duser.region=US, ela deve ficar parecida com isso: netbeans_default_options=”-J-client -J-Xms256m -J-Xmx1024m -J-XX:PermSize=64m -J-XX:MaxPermSize=200m -J-Xverify:none -J-Dapple.laf.useScreenMenuBar=true -J-Dsun.java2d.noddraw=true -J-Duser.language=en -J-Duser.region=US”

E finalmente não teremos mais que aturar “Serviços Web” e sim WebServices :D

Inté

mysql + ubuntu 8.04 = problemas de permissão

É frustrante quando você atualiza algum produto em seu sistema, e algo que simplesmente funcionava para de repente. Bem, ontem eu passei meia hora levando uma surra do mysql e ubuntu achando que o problema era comigo, sendo que existe um bug nessa combinação fatal.
o mySQL possui um comando chamado LOAD DATA INFILE que é usado para carregar uma base de dados a partir de um arquivo de texto qualquer. Este comando é absurdamente veloz (eu carreguei uma tabela com 1.000.209 registros em 6.09 segundos (isso porque tinha uma porrada de aplicação aberta em meu desktop).
Bem, eu ja havia usado este comando várias vezes no passado e ontem ao dar carga na minha tabela do projeto movie lens usando o comando:
LOAD DATA INFILE ‘/home/vinicius/temp/ratings.dat’ INTO TABLE RATING FIELDS TERMINATED BY ‘::’ LINES TERMINATED BY ‘\n’ (user_id,movie_id,rating,@time) set vote_time = FROM_UNIXTIME(@time);, para minha surpresa a mensagem foi:

ERROR 1085 (HY000): The file ‘/home/vinicius/temp/ratings.dat’ must be in the database directory or be readable by all

Bem, ok, será que vacilei com permissões? Após checar as permissões, 744, bem todos podem ler, vamos tentar novamente… Mesmo erro. Vamos apelar chmod 777 ratings.dat … Mesmo erro. Bem, será que é o diretório? mv ratings.dat /tmp/ratings.dat, agora diretório e arquivo com permissões totais 777. Mesmo erro: PUTA QUE PARIU!!!!

Bem, achei no manual do mySQL que era possível adicionar o prefixo LOCAL no comando e desta maneira ele serializa o arquivo e envia ao servidor. Ufa, agora sim, mas porque o comando que sempre funcionou agora não presta pra nada? A resposta esta aqui!
Bem fica como uma dica registrada, pois com certeza mais alguem pode ter este problema e quem sabe o google não apresenta esta página para ajudar aqueles na hora de desespero.

Inté

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é