Yii (вход по AD LDAP )

http://des1roer.blogspot.ru/2015/02/yii.html
Сделано под впечатлением http://habrahabr.ru/post/177873/
Хочу поделиться опытом по LDAP Active Directory (про другие LDAP не знаю, не сталкивался).
Нулевое -  подключаем расширение LDAP к PHP. В OpenServer это так

раскоментить ..\OpenServer\userdata\config
в PHP-5.4_php.ini (ну или какой пхп) строчку
extension=php_ldap.dll

Первое -  качаем adLdap
Кидаем в папку components и adLdap и папки (все из src)

Для начала я подключил adLdap к Yii, как компонент приложения, т.е.:

//
//protected/config/main.php
‘components’ => array(
    ...
    'ldap' => array(
            'class' => 'LdapComponent',
            'baseDn' => 'DC=example,DC=org', //example.org
            'accountSuffix' => '@example.org',
            'domainControllers' => array('dc.example.org'),
            'adminUsername' => 'username',
            'adminPassword' => 'password'
        ),
    ..
)
// 
Соотвественно вбиваем свои реальные данные для коннекта.
Создаем в папке components новый файл
//protected/components/LdapComponent.php
Yii::import('application.vendors.adLDAP.adLDAP');

class LdapComponent extends adLDAP {

    public $baseDn;
    public $accountSuffix;
    public $domainControllers;
    public $adminUsername;
    public $adminPassword;

    public function __construct() {

    }

    public function init() {
        parent::__construct();
    }
}
//
На данном этапе логично протестировать - заработало ли.
С места в карьер, как говорится. 
Где нибудь, например в site\index.php
 
$adldap = Yii::app()->ldap;
$username = 'user';
$password = 'pass';
$authUser = $adldap->user()->authenticate($username, $password);
if ($authUser == true) {
  echo "User authenticated successfully";
}
else {
  // getLastError is not needed, but may be helpful for finding out why:
  echo $adldap->getLastError();
  echo '<br>';
  echo "User authentication unsuccessful";
}  
 
Если что не так - 
 
   $adldap = Yii::app()->ldap;
   echo '<pre>';
   CVarDumper::dump($adldap);
 
В adlpdap должны быть ваши данные, а не стандартные mydomain и прочее.

Если у вас сделана регистрация как у меня (т.е. храним пользователя и пароль в своей 
базе), то можно сделать гибрид для входа и через AD и по данным, сохраненным в базе.

В useridentity поменяем процесс проверки 
 
\protected\components\UserIdentity.php 
 
class UserIdentity extends CUserIdentity
{
    protected $_id;

    public function authenticate()
    {
        $adldap = Yii::app()->ldap;

        $user = User::model()->find('LOWER(u_username)=?', array(strtolower($this->username)));
        
        $username = strtolower($this->username);
        $password = $this->password;
        $authUser = $adldap->user()->authenticate($username, $password);

        if ($user === null)
            $this->errorCode = self::ERROR_USERNAME_INVALID;
        else if ($authUser == true && isset($user))
        {
            $this->_id = $user->u_id;
            $this->username = $user->u_username;
            $this->errorCode = self::ERROR_NONE;
        }
        else if (!$user->validatePassword($this->password))
            $this->errorCode = self::ERROR_PASSWORD_INVALID;
        else if ($user->ban == 1)
            $this->errorCode = self::ERROR_UNKNOWN_IDENTITY;
        else
        {
            $this->_id = $user->u_id;
            $this->username = $user->u_username;
            $this->errorCode = self::ERROR_NONE;            
        }
        return !$this->errorCode;
    }

    public function getId()
    {
        return $this->_id;
    }

}

Не забываем - имя пользователя из LDAP должно первоначально храниться в базе
 (мы его вносим). Это сделано для защиты от всех пользователей AD и 
одновремеено проще администрировать


Популярные сообщения из этого блога

Пишем логи на C# (.NET). Легкий способ.

Средства для работы с базой данный PostgreSql

Авторизация yii 2 из базы