PhpBBIdentity — авторизация юзеров PhpBB3

Выкладываем свои наработки
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

PhpBBIdentity — авторизация юзеров PhpBB3

Сообщение samdark »

Очень сырая, но всё-таки рабочая версия нестандартного UserIdentity для авторизации через базу PhpBB3.

Код: Выделить всё

<?php
/**
 * PhpBBIdentity
 *
 * Сверяет логин-пароль по базе форума PhpBB3
 *
 * user_type
 * ---------
 * 0 - users
 * 1 - inactive
 * 2 - bots
 * 3 - super user
 *
 * group_id
 * --------
 * 1 - anonymous
 * 2 - user
 * 3 - coppa user 
 * 4 - super moderator
 * 5 - admin
 * 6 - bots
 *
 * @version 1.0
 *
 * @author Alenxander Makarov
 * @link http://rmcreative.ru/
 *  
 */
class PhpBBIdentity extends CUserIdentity {
    protected $_id;

    function authenticate() {
        //TODO: move connection to config
        $conn = Yii::app()->forumDb;

        $command = $conn->createCommand(
            'SELECT `user_id`, `username_clean`, `user_password`, `user_type`, `group_id`
             FROM `users`
             WHERE `user_type` NOT IN (1, 2)
             AND `group_id` NOT IN (1, 3, 6)
             AND `username_clean` = LOWER(:username)
             LIMIT 1'
        );

        $command->bindParam(":username", $this->username, PDO::PARAM_STR);
        $user = $command->queryRow();

        if(!$user) {
            $this->errorCode = self::ERROR_UNKNOWN_IDENTITY;
            return !$this->errorCode;
        }
       
        if ($this->phpbb_check_hash($this->password, $user['user_password'])){
            $this->_id = $user['user_id'];
            $this->errorCode = self::ERROR_NONE;
            $this->setRole($user);
        }
        else {
            $this->errorCode = self::ERROR_PASSWORD_INVALID;
        }

        return !$this->errorCode;
    }

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

   function setRole($user){
        if($user['user_type']==3) {
            $role = 'admin';
        }
        else {
            switch($user['group_id']){
                case 2:
                    $role = 'user';
                break;
                case 3:
                    $role = 'moderator';
                break;
                case 5:
                    $role = 'administrator';
                break;
            }
        }
        $this->setState('role', $role);        
    }

   /**
    * Check for correct password
    *
    * @param string $password The password in plain text
    * @param string $hash The stored password hash
    *
    * @return bool Returns true if the password is correct, false if not.
    */
    private function phpbb_check_hash($password, $hash){
        $itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
        if (strlen($hash) == 34){
            return ($this->_hash_crypt_private($password, $hash, $itoa64) === $hash) ? true : false;
        }

        return (md5($password) === $hash) ? true : false;
    }

   /**
    * The crypt function/replacement
    */
    private function _hash_crypt_private($password, $setting, &$itoa64){
        $output = '*';

        // Check for correct hash
        if (substr($setting, 0, 3) != '$H$'){
            return $output;
        }

        $count_log2 = strpos($itoa64, $setting[3]);

        if ($count_log2 < 7 || $count_log2 > 30){
            return $output;
        }

        $count = 1 << $count_log2;
        $salt = substr($setting, 4, 8);

        if (strlen($salt) != 8){
            return $output;
        }

        /**
        * We're kind of forced to use MD5 here since it's the only
        * cryptographic primitive available in all versions of PHP
        * currently in use.  To implement our own low-level crypto
        * in PHP would result in much worse performance and
        * consequently in lower iteration counts and hashes that are
        * quicker to crack (by non-PHP code).
        */
        if (PHP_VERSION >= 5){
            $hash = md5($salt . $password, true);
            do {
                $hash = md5($hash . $password, true);
            }
            while (--$count);
        }
        else {
            $hash = pack('H*', md5($salt . $password));
            do {
                $hash = pack('H*', md5($hash . $password));
            }
            while (--$count);
        }

        $output = substr($setting, 0, 12);
        $output .= $this->_hash_encode64($hash, 16, $itoa64);

        return $output;
    }

    /**
    * Encode hash
    */
    private function _hash_encode64($input, $count, &$itoa64){
        $output = '';
        $i = 0;

        do {
            $value = ord($input[$i++]);
            $output .= $itoa64[$value & 0x3f];

            if ($i < $count) {
                $value |= ord($input[$i]) << 8;
            }

            $output .= $itoa64[($value >> 6) & 0x3f];

            if ($i++ >= $count) break;

            if ($i < $count) {
                $value |= ord($input[$i]) << 16;
            }

            $output .= $itoa64[($value >> 12) & 0x3f];

            if ($i++ >= $count) break;

            $output .= $itoa64[($value >> 18) & 0x3f];
        }
        while ($i < $count);

        return $output;
    }
}
 
Александр
Сообщения: 7
Зарегистрирован: 2010.12.03, 19:27

Re: PhpBBIdentity — авторизация юзеров PhpBB3

Сообщение Александр »

а как вообще воткнуть этот форум в сайт чтобы он работал? в каких файлах нежно что-нибудь менять? подскажите, а тоя уже не знаю у кого спросить
Аватара пользователя
RSol
Сообщения: 325
Зарегистрирован: 2010.05.07, 08:36
Откуда: Северодонецк, Украина
Контактная информация:

Re: PhpBBIdentity — авторизация юзеров PhpBB3

Сообщение RSol »

Александр писал(а):а как вообще воткнуть этот форум в сайт чтобы он работал? в каких файлах нежно что-нибудь менять? подскажите, а тоя уже не знаю у кого спросить
сори за оффтоп, но не сдержался:
менять в файлах всегда нужно нежно :-)
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: PhpBBIdentity — авторизация юзеров PhpBB3

Сообщение samdark »

Что значит «воткнуть этот форум в сайт»?
Александр
Сообщения: 7
Зарегистрирован: 2010.12.03, 19:27

Re: PhpBBIdentity — авторизация юзеров PhpBB3

Сообщение Александр »

т.е. сделать как здесь
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: PhpBBIdentity — авторизация юзеров PhpBB3

Сообщение samdark »

М… ну здесь просто форум поставлен, с сайтом интеграции пока никто не видел, кроме меня, так что считайте, что её просто нет.
bzz
Сообщения: 5
Зарегистрирован: 2011.05.04, 18:31

Re: PhpBBIdentity — авторизация юзеров PhpBB3

Сообщение bzz »

подскажите, пожалуйста. вот такая ошибка вылетает

Код: Выделить всё

CException

 Property "CWebApplication.forumDb" is not defined. 

/var/www/xbox/framework/base/CModule.php(88)
076     /**
077      * Getter magic method.
078      * This method is overridden to support accessing application components
079      * like reading module properties.
080      * @param string $name application component or property name
081      * @return mixed the named property value
082      */
083     public function __get($name)
084     {
085         if($this->hasComponent($name))
086             return $this->getComponent($name);
087         else
088             return parent::__get($name);
089     }
090 
091     /**
092      * Checks if a property value is null.
093      * This method overrides the parent implementation by checking
094      * if the named application component is loaded.
095      * @param string $name the property name or the event name
096      * @return boolean whether the property value is null
097      */
098     public function __isset($name)
099     {
100         if($this->hasComponent($name)) 
что в forumDb нужно прописать и где?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: PhpBBIdentity — авторизация юзеров PhpBB3

Сообщение samdark »

Скопировать в в конфиге настройки для компонента db и поменять на актуальные для базы форума.
bzz
Сообщения: 5
Зарегистрирован: 2011.05.04, 18:31

Re: PhpBBIdentity — авторизация юзеров PhpBB3

Сообщение bzz »

спасибо, но теперь оно пишет

Код: Выделить всё

CException

 Object configuration must be an array containing a "class" element. 
добавил в конфиг элемент class, но что там нужно указать ?
bzz
Сообщения: 5
Зарегистрирован: 2011.05.04, 18:31

Re: PhpBBIdentity — авторизация юзеров PhpBB3

Сообщение bzz »

аа, все. разобрался.
еще бы как-нибуть сделать, что бы оно логинилось и на форуме сразу. :)
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: PhpBBIdentity — авторизация юзеров PhpBB3

Сообщение samdark »

Вот до этого я не добрался…
Аватара пользователя
RSol
Сообщения: 325
Зарегистрирован: 2010.05.07, 08:36
Откуда: Северодонецк, Украина
Контактная информация:

Re: PhpBBIdentity — авторизация юзеров PhpBB3

Сообщение RSol »

Сделал расширение которое умеет:
* login
* logout
* user_add
* user_delete
* change_password
* user_update
* loggedin

Подключение в секции компонентов:

Код: Выделить всё

...
        'phpBB'=>array(
            'class'=>'ext.phpBB.phpBB',
            'path'=>dirname(dirname(dirname(__FILE__))).'/forum/',
            'php'=>'php',//default
            'user_table'=>'phpbb_users',//default
        ),
...
 
Использование:

Код: Выделить всё

Yii::app()->phpBB->login($user->phpBBLogin,$this->password);
 
и.т.д.

P.S. Для корректной работы необходимо в настройках форума "Общие - Регистрация пользователей" отключить опцию "Активация аккаунта".
Вложения
phpBB.7z
папка компонента
(3.02 КБ) 807 скачиваний
Аватара пользователя
aZlo
Сообщения: 15
Зарегистрирован: 2010.12.29, 15:21
Откуда: Moscow

Re: PhpBBIdentity — авторизация юзеров PhpBB3

Сообщение aZlo »

RSol , большое спасибо за расширение очень сильно пригодилось.
Как в прочем и Sam Dark'у за авторизацию.
Аватара пользователя
RSol
Сообщения: 325
Зарегистрирован: 2010.05.07, 08:36
Откуда: Северодонецк, Украина
Контактная информация:

Re: PhpBBIdentity — авторизация юзеров PhpBB3

Сообщение RSol »

aZlo писал(а):RSol , большое спасибо за расширение очень сильно пригодилось.
Как в прочем и Sam Dark'у за авторизацию.
Обращаетесь. :-)
Stepan
Сообщения: 23
Зарегистрирован: 2010.09.09, 18:48

Re: PhpBBIdentity — авторизация юзеров PhpBB3

Сообщение Stepan »

RSol, не получается воспользоваться твоим расширением:

1. Форум на sqlite 3.0.9, инсталл чистый. Регистрация пользователей выключена.
2. Когда делаю вызов user_add(передаю первые 3 параметра), сначала такой набор ошибок(файлы на месте и доступ к ним тоже):

Код: Выделить всё

[phpBB Debug] PHP Warning: in file /home/yii-1.1.8/framework/YiiBase.php on line 421: include(utf_normalizer.php) [function.include]: failed to open stream: No such file or directory
[phpBB Debug] PHP Warning: in file /home/yii-1.1.8/framework/YiiBase.php on line 421: include() [function.include]: Failed opening 'utf_normalizer.php' for inclusion (include_path='.....')

General Error
SQL ERROR [ sqlite ]

SQL logic error or missing database [1]
 
3. Но пользователь на форум добавляется(возможно криво, обычный логин на форуме не срабаывает пароль в user_add() на прямую пишу "123456"), дальнейший автологин через login ествественно тоже не срабатывает из-за ошибок.
Аватара пользователя
RSol
Сообщения: 325
Зарегистрирован: 2010.05.07, 08:36
Откуда: Северодонецк, Украина
Контактная информация:

Re: PhpBBIdentity — авторизация юзеров PhpBB3

Сообщение RSol »

Была у меня как-то такая проблема.

Как решил убей не помню... :-(

Попробуйте вот так:

Код: Выделить всё

public function init()
    {
        if(!$this->path)
            throw new CException("Don't set forum path");

        Yii::import($this->path.'/includes/utf/utf_normalizer.php');

        $this->_phpbb = new phpbbClass($this->path, $this->php);
    } 
хотя не уверен
Stepan
Сообщения: 23
Зарегистрирован: 2010.09.09, 18:48

Re: PhpBBIdentity — авторизация юзеров PhpBB3

Сообщение Stepan »

RSol писал(а):Была у меня как-то такая проблема.

Как решил убей не помню... :-(

Попробуйте вот так:

Код: Выделить всё

public function init()
    {
        if(!$this->path)
            throw new CException("Don't set forum path");

        Yii::import($this->path.'/includes/utf/utf_normalizer.php');

        $this->_phpbb = new phpbbClass($this->path, $this->php);
    } 
Спасибо, на счет импорта думал не самое лучшее решение, потому что мало ли что оно там еще захочет подключить, Yii::import('webroot. ... .utf_normalizer') убрал warnings, теперь видимо осталась проблема самого phpBB с sqlite -> SQL logic error or missing database [1]
Stepan
Сообщения: 23
Зарегистрирован: 2010.09.09, 18:48

Re: PhpBBIdentity — авторизация юзеров PhpBB3

Сообщение Stepan »

Вобщем с sqlite не будет работать.
Аватара пользователя
usualdesigner
Сообщения: 119
Зарегистрирован: 2011.08.08, 13:23
Откуда: Киев, Украина
Контактная информация:

Re: PhpBBIdentity — авторизация юзеров PhpBB3

Сообщение usualdesigner »

bzz писал(а):аа, все. разобрался.
еще бы как-нибуть сделать, что бы оно логинилось и на форуме сразу. :)

Подскажи, КАК разобрался? А то у меня проблема аналогичная, победить не могу никак...все это же сообщение "Конфигурация объекта должна быть представлена массивом, содержащим элемент "class". " Тут подробно http://img1.uploadscreenshot.com/images ... 7-orig.png
Werewolf
Сообщения: 98
Зарегистрирован: 2010.02.27, 14:37
Контактная информация:

Re: PhpBBIdentity — авторизация юзеров PhpBB3

Сообщение Werewolf »

usualdesigner писал(а):Подскажи, КАК разобрался? А то у меня проблема аналогичная, победить не могу никак...все это же сообщение "Конфигурация объекта должна быть представлена массивом, содержащим элемент "class". " Тут подробно http://img1.uploadscreenshot.com/images ... 7-orig.png

Код: Выделить всё

'forumDb'=>array(
            'connectionString' => 'mysql:host=localhost;dbname=phpbb',
            'emulatePrepare' => true,
            'username' => 'phpbb',
            'password' => 'пароль',
            'charset' => 'utf8',
            'tablePrefix' => '',
            'class' => 'CDBConnection',
        ),
 
Вот тут нужно не забыть class указать, так впрочем для всех новых соединений с базой в Yii.
Ответить