Olá caros,
Estou tentando desenvolver um sistema Java para controle do LDAP da instituição onde trabalho.
Os códigos para alteração de senha, exclusão de usuários, verificação de autenticidade eu já tenho todos prontos e funcionando corretamente.
Meu problema está na inserção de usuários. Tirando um ldiff do LDAP, eu vi que são criadas várias informações automaticamente, por exemplo, se eu crio o usuário convidado.02 com o seguinte código no meu server:
ldapadduser convidado.02 aluno 4302
O LDAP já cria o homeDirectory do usuário e depois de cadastrado a senha, ele me gera no ldiff as seguintes informações do usuário:
dn: uid=convidado.02,ou=Users,dc=nodomain
objectClass: account
objectClass: posixAccount
cn: convidado.02
uid: convidado.02
uidNumber: 4302
gidNumber: 10000
homeDirectory: /home/users/convidado.02
loginShell: /bin/bash
gecos: convidado.02
description: User account
userPassword:: e01ENX05RWNzV2doSi9UbTR3eG00SjVVWW1BPT0=
Pra fazer o cadastro em java, eu tive de criar todas as linhas do ldiff como atributos para inserção, e ainda assim, não foi possível criar o homeDirectory.
Segue o código de teste q eu utilizei:
import java.util.Hashtable;
import javax.naming.AuthenticationException;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
public class AddUserLdap {
public static void main(String args[]) {
//Autenticação para alteração de senha precisa ser feita com o Admin do LDAP
String username = "admin";
String password = "senha";
String atributosConexao = "cn=" + username + ",dc=nodomain";
Hashtable authEnv = new Hashtable(11);
authEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
authEnv.put(Context.PROVIDER_URL, "ldap://192.168.100.10:389");
authEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
authEnv.put(Context.SECURITY_PRINCIPAL, atributosConexao);
authEnv.put(Context.SECURITY_CREDENTIALS, password);
try {
DirContext authContext = new InitialDirContext(authEnv);
System.out.println("Autenticado!");
Attribute objectClass = new BasicAttribute("objectClass"); //Adding Object Classes
objectClass.add("account");
objectClass.add("posixAccount");
String userAdd = "teste.java";
String uidNumber = "6000";
String gidNumber = "10000";
String homeDirectory = "/home/users/" + userAdd;
String loginShell = "/bin/bash";
String description = "User account";
String userPassword = "1234";
BasicAttributes myAttrs = new BasicAttributes(true);
myAttrs.put(objectClass);
myAttrs.put("cn", userAdd);
myAttrs.put("uid", userAdd);
myAttrs.put("uidNumber", uidNumber);
myAttrs.put("gidNumber", gidNumber);
myAttrs.put("homeDirectory", homeDirectory);
myAttrs.put("loginShell", loginShell);
myAttrs.put("gecos", userAdd);
myAttrs.put("description", description);
myAttrs.put("userPassword", userPassword);
InitialDirContext iniDirContext = (InitialDirContext) authContext;
String groupDN = "ou=Users,dc=nodomain";
authContext.bind("uid=" + userAdd + "," + groupDN, iniDirContext, myAttrs);
System.out.println("Adicionado com êxito! ");
authContext.close();
} catch (AuthenticationException authEx) {
System.out.println("Erro na autenticação! ");
System.out.println(authEx.getMessage());
} catch (NamingException namEx) {
System.out.println("Problemas na conexão! ");
System.out.println(namEx.getMessage());
}
}
}
Creio que para fazer a inserção de um novo usuário, não deveria ser necessário passar todas essas informações, o comando ldapadduser já cria tudo pra mim (então pq o bind não cria?), acho que a única coisa que eu deveria passar é a árvore do meu LDAP (cn,ou), nome de usuário e senha criptografada.
Alguém sabe como resolver isso, ou como ao menos fazer com que o LDAP crie pra mim o HomeDirectory do usuário recém criado?
Fico no aguardo e agradeço qualquer ajuda.
- mas deve faltar alguma coisinha para ele não conseguir criar o home directory, como você percebeu 