O Serviço de Autenticação e Autorização do Java (JAAS) é uma das pernas mais criticadas do Java EE, sendo usualmente alvo de reclames por demandar muita configuração para obter uma simples proteção com usuário e senha para uma página. O que pouca gente sabe é que o JAAS foi concebido para muito mais que isso, permitindo a criação de Login Modules plugáveis a serem reutilizados por diversas aplicações num mesmo container, torando-as independentes da tecnologia de segurança.
Tendo em vista essa possibilidade, os servidores de aplicação costumam já fornecer alguns Login Modules prontos, genéricos e configuráveis. Um deles é o Login Module para LDAP, o protocolo de diretório de acesso padrão para redes.
Abaixo demonstro uma configuração possível no Jboss EAP 6. Para tanto, suponha a existência de um LDAP onde há um usuário administrador chamado ldap-admin, (uid=ldap-admin,ou=admins,dc=suaempresa,dc=com,dc=br) cuja senha é 12345, e que tennha permissão para fazer buscas nesse diretório. Além disso, os demais usuários dessa rede podem ser uniqueMember de grupos do domínio dc=suaempresa,dc=com,dc=br.
No standalone.xml do seu JBoss, inclua o seguinte domínio de segurança:
<security-domain name="ldap-suaempresa"> <authentication> <login-module code="LdapExtended" flag="required"> <module-option name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory"/> <module-option name="java.naming.provider.url" value="ldap://ldap.suaempresa.com.br"/> <module-option name="java.naming.security.authentication" value="simple"/> <module-option name="bindDN" value="uid=ldap-admin,ou=admins,dc=suaempresa,dc=com,dc=br"/> <module-option name="bindCredential" value="12345"/> <module-option name="baseCtxDN" value="dc=suaempresa,dc=com,dc=br"/> <module-option name="baseFilter" value="(uid={0})"/> <module-option name="rolesCtxDN" value="dc=suaempresa,dc=com,dc=br"/> <module-option name="roleFilter" value="(uniqueMember={1})"/> <module-option name="roleAttributeID" value="cn"/> <module-option name="throwValidateError" value="true"/> </login-module> </authentication> </security-domain>
Perceba a presença dos parâmetros {0} e {1} nas opções do módulo. A opção {0} advém do nome de usuário digitado na caixa de login da aplicação. Aqui ela é usada para representar o uid do usuário no diretório LDAP. A opção {1} advém da role configurada para proteger um recurso da aplicação. Aqui ela é usada para representar o nome do grupo do qual o usuário em questão deve fazer parte no diretório LDAP.
Uma vez configurado isso, nas suas aplicações web onde seja desejado integrar com o LDAP será preciso criar o arquivo WEB-INF/jboss-web.xml solicitando o uso do serviço JAAS criado anteriormente:
<?xml version='1.0' encoding='UTF-8' ?> <jboss-web> <security-domain>java:/jaas/ldap-suaempresa</security-domain> </jboss-web>
Além disso, será necessário configurar a segurança no WEB-INF/web.xml, usando os nomes dos grupos do LDAP como possíveis roles:
... <security-constraint> <web-resource-collection> <web-resource-name>private_equipe1</web-resource-name> <description>recursos da equipe 1</description> <url-pattern>/private/equipe1/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>equipe1</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>BASIC</auth-method> <realm-name>Utilize a senha do LDAP da SuaEmpresa</realm-name> </login-config> <security-role> <role-name>equipe1</role-name> </security-role> ...