Autênticação ao Sistema

Amigos,

Estou com um grande problema e não sei se vocês podem me ajudar, bem é o seguinte:

Aqui na empresa tenho vários usuários no Active Diretory do windows no servisor, e gostaria de usar esses usuários cadastrados para não tá cadastrando sempre novos.

Resumindo, como minha aplicação do Yii pode visualizar estes usuários? É possível fazer isto?

Sds,

Opa,

Talvez essa extensão: http://www.yiiframework.com/extension/ldaprecord

ou alguma outra que conecte com LDAP

Amigo,

Com isso consigo ligar minha apliação do Yii com os usuários do Active Diretory do Windows. Se consiguir fazer isso não precisarei mais inserir usuários pois já temos aqui todos os usuários com senhas definidos em nosso servidor. Na minha aplicação coloco só as permissões a cada um. Isso é possível???

Sds,

Bom, eu não sei te dizer se é possível fazer esse tipo de autenticação com Yii nativamente, (to começando ocm ele ainda), mas talvez o pessoal daqui do forum ajude.

Mas, se com PHP e o protocolo LDAP da pra fazer, é so implementar no framework

br2.php.net/manual/pt_BR/ref.ldap.php

Abraço

Adrian,

O que você quer tem como fazer, mais o sistema precisa está hospedado no servidor que tem o AD.

Referência: http://php.net/manual/pt_BR/book.ldap.php

Ou se for numa rede interna, vc pode passar o endereço do servidor com AD

Como poderiar passar esse endereço amigo, tens algum exemplo aí?

Sds,

No proprio endereço la tem o exemplo de utilização…

www.php.net/manual/pt_BR/ldap.examples-basic.php

Aí onde está o localhost, vc coloca o end do servidor (tipo: 192.168.2.100)

:D

Amigos,

Consegui resolver meu problema em partes, vou tentar explicar:

A minha aplicação existe uma tabela de usuarios cadastrados, porém gostaria que automaticamente minha aplicação fizesse uma conexão com o Active Diretory do windows, pegando assim todos usuários. Consegui fazer isto, porém gostaria que fizesse o seguinte. Quando o usuário logasse, com o usuário do Active, a aplicação comparasse com o usuário que está na tabela da aplicação, e desse as devidas permissões que tb estão definidas na aplicação. Se o usuário do Active não tivesse no banco da aplicação mostraria uma mensagem, que esse usuário não tem permissão para entrar no sistema.

Se alguém não entendeu, posso explicar de novo.

Abaixo a conexão com os usuário do Active Directory via LDAP

\protected\components\UserIdentity.php




class UserIdentity extends CUserIdentity {

	public function getId() {

    	return usuario::model()->findByAttributes(array('login' => $this->username))->idusuario;

	}


	public function authenticate() {


    	$users = usuario::listUserPassword();

    	// Tenta se conectar com o servidor


    	$servidor_ad = 'XXX.XXX.XXX.XXX'; // Endereco IP do servidor AD

    	$dominio_ad = 'DDDDDDD'; // Nome do dominio


    	$ldap = @ldap_connect($servidor_ad);


    	// Tenta autenticar no servidor


    	ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);

    	ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);


    	if (!($bind = @ldap_bind($ldap, "{$this->username}@{$dominio_ad}", $this->password))) {

        	$this->errorCode = self::ERROR_PASSWORD_INVALID;

    	} else {

        	$this->errorCode = self::ERROR_NONE;

    	}


    	return!$this->errorCode;

	}

}



Depois descomentem a linha “extension=php_ldap.dll” no arquivo “php.ini”.

Com isso todos os usuários cadastrados na empresa podem acessar o Sistema com seus usuários e senhas padrão da empresa. Mas quando é um usuário que não está no banco da minha aplicação, dá um erro assim




Trying to get property of non-object	


	public function getId() {

    	return usuario::model()->findByAttributes(array('login' => $this->username))->idusuario; //Erro nesta linha

	}



Alguém pode me ajudar a tirar esse erro. Agora falta pouco!!

Obrigado a todos.


// .......

if (!($bind = @ldap_bind($ldap, "{$this->username}@{$dominio_ad}", $this->password))) {

  $this->errorCode = self::ERROR_PASSWORD_INVALID;

}

else {

  $this->errorCode = self::ERROR_NONE;


  // Pesquisa o usuário aqui e verifica se ele ta na tabela  

  $user = Usuario::model()->findByAttributes(array('login' => $this->username));

  if (is_null($user))

    $this->errorCode = self::CODIGO_DO_ERRO_DE_USUARIO_NAO_CADASTRADO_NA_APPLICACAO;

  // Aqui vc pode até cadastrar a malandro se quiser.

}


return!$this->errorCode;

}

Deu tudo certo agora…

Muito obrigado a todos que me ajudaram nesta dúvida, fica a deixa pra quem necessitar conectar a usuários no servidor, é só seguir passo a passo como descrito neste post.

Amigo é possível eu conseguir mostrar o nome desse usuário. Nome esse que tá guardado no servidor? Pois assim não precisava guardar esse nome na minha tabela da aplicação. Quer dizer, guardar várias informações que já tenho no servidor.

Como por exemplo: Assim que o usuário se logarm no index.php mostrar uma frase tipo: olá, fulano de tal!

Sds,

Cara, eu não sei. Não saco nada de LDAP.

Vamos ver se alguem que saca mais da uma força.

Oi Adrian,

Estou começando a utilizar o Yii e também tenho a intenção de utilizar uma aplicação que usa o LDAP, estava verificando o seu código e não entendi a seguinte chamada: $users = usuario::listUserPassword(); vc criou uma função listUserPassword() no model para verificar os usuários??, tentei utilizar esse seu código do UserIdentity.php, mas ñ estou conseguindo logar na aplicação, apenas fica uma tela em branco após inserir os dados de usuário e senha. Poderia me ajudar??

[]'s

Ana Paula

Querida na verdade você não precisa colocar esta função listUserPassword(), não serve pra nada. Para da certo você tem que liberar o php_ldap.dll. e fazer as configurações do servidor interno de vcs.

Adrian,

Essa função aqui:


public function getId() {

        return usuario::model()->findByAttributes(array('login' => $this->username))->idusuario; //Erro nesta linha

        }

Ela é redundante, você pode eliminar ela, senão toda vez que for buscar o ID do usuário, ele vai ficar consultando no banco de dados.




class UserIdentity extends CUserIdentity {


	public $_id

	

	public function authenticate() {


        $users = usuario::listUserPassword();

        // Tenta se conectar com o servidor


        $servidor_ad = 'XXX.XXX.XXX.XXX'; // Endereco IP do servidor AD

        $dominio_ad = 'DDDDDDD'; // Nome do dominio


        $ldap = @ldap_connect($servidor_ad);


        // Tenta autenticar no servidor

        ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);

        ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);


        if (!($bind = @ldap_bind($ldap, "{$this->username}@{$dominio_ad}", $this->password))) {

			$this->errorCode = self::ERROR_PASSWORD_INVALID;

        } else {

			$this->_id = usuario::model()->findByAttributes(array('login' => $this->username))->idusuario;

			$this->errorCode = self::ERROR_NONE;

        }


        return!$this->errorCode;

	}

	

	public function getId() {

        return $this->_id;

	}


}



Assim deve eliminar o erro, por que a consulta é feita se houver sucesso na autenticação.

OK Newerton já tinha feito isso sim…Valeu!!

Posta a solução pra nós! Vai que futuramente alguém necessita, ou é somente essa parte de autenticação que é mais importante?