menu
Fórum Adianti
menu Menu
Autenticação de usuários via ldap Bom dia pessoal! A alguns dias atrás eu estava precisando criar um script para utilizar a autenticação via ldap com o adianti. segue abaixo uma modificação que fiz no /app/model/SytemUser.class.php ...
MA
Autenticação de usuários via ldap  
Bom dia pessoal!

A alguns dias atrás eu estava precisando criar um script para utilizar a autenticação via ldap com o adianti.
segue abaixo uma modificação que fiz no /app/model/SytemUser.class.php

  1. <?php
  2.        public static function authenticate($login$password)
  3.     {
  4.       //FAZ A VERIFICAÇÃO COM O LDAP. SE ENCONTRA O USUÁRIO NO LDAP, ELE VERIFICA SE ESSE MESMO USUÁRIO JÁ É USUÁRIO DO SISTEMA.
  5.       //SE SIM ELE PEGA A SENHA ATUAL (QUE É A SENHA DO LDAP) E ATUALIZA A SENHA DO USUÁRIO NO SISTEMA.
  6.       //APÓS ISSO ELE FAZ O LOGIN NO SISTEMA (LOGIN PADRÃO DO ADIANTI)
  7.       // Função que verifica se o usuário ja esta cadastrado no sistema. Sem verificação de senha, só pelo Login.
  8.       $ldapini parse_ini_file('app/config/ldap.ini');
  9.       $ldap ldap_connect($ldapini['ldap_host'], $ldapini['ldap_port']);
  10.       ldap_set_option($ldapLDAP_OPT_PROTOCOL_VERSION3);
  11.       if($bindlogin = @ldap_bind($ldap"cn=$login,".$ldapini['ldap_people'], $password)) {
  12.         if($bindgrupo = @ldap_bind($ldap$ldapini['ldap_binddn'], $ldapini['ldap_password'])) {
  13.           $attributes_ad = array("displayName","description","cn","givenName","sn","email","co","mobile","company");
  14.           $people="cn=$login,".$ldapini['ldap_people'];
  15.           $result ldap_search($ldap$people"(&(uid=*)(objectclass=inetOrgPerson))"$attributes_ad) or die ("Error in search query");
  16.           $info ldap_get_entries($ldap$result);
  17.           //ABAIXO PODE-SE VERIFICAR OS CAMPOS DO $info PARA PEGAR AS INFORMAÇÕES NECESSÁRIAS PARA CRIAR O USUÁRIO NO ADIANTI
  18.           // utilizado para questões de consulta as informações
  19.           //   echo "<pre>";
  20.           //   //Now, to display the results we want:
  21.           //   for ($i=0; $i<$info["count"]; $i++) {
  22.           //   echo $info[$i]['dn'] . ":" . $info[$i]['displayname'][0] . ":" . $info[$i]['email'][0] . "\n";
  23.           //   var_dump($info);
  24.           //    //print_r($info);
  25.           //  }
  26.           //  echo "</pre>";
  27.           //ABAIXO FAZ A VERIFICAÇÃO SE O USUÁRIO DO LDAP JÁ ESTA CADASTRADO NO SISTEMA
  28.           if ($info[0]['dn']=='cn='.$login.',ou=People,dc=xxx,dc=xx,dc=xx,dc=xx') {
  29.               //Grupo OK!
  30.               TTransaction::open('permission');
  31.               $criteriaAddUser = new TCriteria;
  32.               $criteriaAddUser->add(new TFilter('login''='$login));
  33.               $repositoryAddUser = new TRepository('SystemUser');
  34.               $usuarioAdd $repositoryAddUser->load($criteriaAddUser);
  35.               if (!$usuarioAdd)
  36.               {
  37.                 $newSystemUser = new SystemUser;
  38.                 $senhaHash md5($password);
  39.                 $newSystemUser->login $login;
  40.                 $newSystemUser->name $info[0]['displayname'][0];
  41.                 $newSystemUser->password $senhaHash;
  42.                 $newSystemUser->email $login.'@jaraguadosul.sc.gov.br';
  43.                 $newSystemUser->frontpage_id 7;
  44.                 $newSystemUser->active 'Y';
  45.                 $newSystemUser->store();
  46.                 $newSystemUser->addSystemUserGroup(new SystemGroup(2));
  47.               } else {
  48.                 $senhaHash md5($password);
  49.                 $newUser self::newFromLogin($login);
  50.                 $newUser->password $senhaHash;
  51.                 $newUser->store();
  52.               }
  53.           } else {
  54.               //Usuario NAO no grupo acessa_RH!";
  55.               new TMessage('error',  'Não faz parte do grupo de pessoas cadastradas.');
  56.               exit;
  57.           }
  58.         } else {
  59.           //Falha ao conectar ao sevidor LDAP!";
  60.           new TMessage('error',  'Não acessa LDAP');
  61.           exit;
  62.         }
  63.       } else {
  64.         //Login incorreto!
  65.         new TMessage('error',  'Login Incorreto. Verifique sua senha de acesso.');
  66.         exit;
  67.       }
  68. //A PARTIR DESTE PONTO CONTINUA O SCRIPT PADRÃO.
  69.         $user self::newFromLogin($login);
  70.         if ($user instanceof SystemUser)
  71.         {
  72.             if ($user->active == 'N')
  73.             {
  74.                 throw new Exception(_t('Inactive user'));
  75.             }
  76.             else if (isset( $user->password ) AND ($user->password == md5($password)) )
  77.             {
  78.                 return $user;
  79.             }
  80.             else
  81.             {
  82.                 throw new Exception(_t('Wrong password'));
  83.             }
  84.         }
  85.         else
  86.         {
  87.             throw new Exception(_t('User not found'));
  88.         }
  89.     }
  90. ?>




Espero poder ajudar alguém com esse código.
Demorei um pouco para fazê-lo devido a demanda de outras atividades e também por desconhecer completamente a árvore de acessos do sistema.


Para funcionar, só terão que criar o ldap.ini com as seguintes configurações:

ldap_host= ldap_port= ldap_binddn= ldap_password= ldap_basedn= ldap_people_ou= ldap_group_ou= ldap_people=

Curso completo Meu Negócio Pronto
Use para si, ou transforme em um negócio: Inclui aulas e códigos-fontes
Gestor de conteúdo (SITE) + Loja Virtual (E-Commerce) + Emissor de Notas para infoprodutos


Meu negócio pronto Quero me inscrever agora!

Comentários (7)


MA

Obs adicionais:

Adicionei a página de id=7 nas páginas acessadas pelos usuários do grupo de usuários "standard"
Se alguem quiser manter o usuário admin (até configurar o seu usuário do ldap no grupo dos admin), basta tirar o exit de onde tem escrito "Login Incorreto". ele vai mostrar a mensagem mas ainda vai logar no sistema.
JC

Saudações Marcos,

obrigado pela contribuição, a aplicação será de grande valia para o uso no trabalho, por acaso é possível implementar o cadastro,alteração e exclusão dos usuários pelo adianti?
MA

Deixa eu ver se entendi, tu queres poder adicionar usuarios no ldap via o adianti, isso?


Creio que seja possível. Não cheguei a fazer...
Mesmo por que aqui na prefeitura, onde trabalho, o nosso servidor ldap é o mestre-mor das senhas e acessos, saca? Ele é quem manda em tudo, todos os outros sistemas conectam nele. Nós criamos primeiro o acesso no ldap e depois vamos dando permissões para os outros sistemas (instant messenger, acesso a internet, e, nesse caso, ao adianti). Não faria, no nosso caso, o adianti criar o acesso no ldap, se o processo interno aqui é ao contrário.

MS

Obrigado pela contribuição Marcos.
Hoje mesmo recebi um projeto que terá os usuários via LDAP.
LJ

Essa função foi muito boa para mim e para o aprendizado, mas gostaria de deixar avisado aos novatos que na versão 5.5 do Adianti, o LDAP é nativo, bastando apenas uma configuração simples.
JA

Olá,

Pessoal estou tentando usar LDAP na versão 5.5 do AD, estou sem saber como configurar meu ldap.ini reporta o seguinte erro
[Fri Oct 12 13:29:15.056414 2018] [php7:error] [pid 26485] [client ::1:56358] PHP Fatal error: Uncaught Error: Call to undefined function ldap_connect() in /var/www/html/guiansoft/livre_5.5/app/service/auth/LdapAuthenticationService.php:7\nStack trace:\n#0 /var/www/html/guiansoft/livre_5.5/app/control/admin/LoginForm.class.php(145): LdapAuthenticationService::authenticate('resp', '123')\n#1 [internal function]: LoginForm::onLogin(Array)\n#2 /var/www/html/guiansoft/livre_5.5/lib/adianti/core/AdiantiCoreApplication.php(49): call_user_func(Array, Array)\n#3 /var/www/html/guiansoft/livre_5.5/engine.php(32): Adianti\\Core\\AdiantiCoreApplication::run(true)\n#4 /var/www/html/guiansoft/livre_5.5/engine.php(64): TApplication::run(true)\n#5 {main}\n thrown in /var/www/html/guiansoft/livre_5.5/app/service/auth/LdapAuthenticationService.php on line 7, referer: http://localhost/guiansoft/livre_5.5/index.php?class=LoginForm


Meu ldap.ini está assim:
server = localhost port = 389 domain = localhost/guiansoft/livre_5.5


Att,
Jonathas Alves
WR

Jonathas, para fazer a conexão com o LDAP vai depender da forma que você tem ele implementado ai na sua empresa.
O exemplo que o Marcos postou, funciona de boa, caso seu ambiente esteja implementado de forma semelhante, irá funcionar com pequenos ajustes.
Eu estou usando dessa forma, mesmo na versão 5.5.
Verifica também no seu ambiente se você tem o pacote phpX.X-ldap instalado (X.X = sua versão instalada), caso contrário não irá funcionar!!!

Abraços