Форум программистов, компьютерный форум, киберфорум
PHP: Yii, Yii2
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
10 / 10 / 5
Регистрация: 31.01.2012
Сообщений: 98
1

Yii и phpBB3. Мост

15.03.2013, 19:31. Показов 1442. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.

Yii framework начал осваивать недавно. Появился вопрос, на который не могу найти ответ
Есть форум на phbBB с базой пользователей. Как сделать общую аутентификацию? т.е. сайт и форум должны использовать одну БД пользователей. Регистрация одна, через форум. Интересует именно аутентификация на сайте.

Советовали использовать общие cookies. Все равно не понятно. Может есть какое-то готовое решение?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.03.2013, 19:31
Ответы с готовыми решениями:

При какой скорости автомобиля давление,оказываемое им на вогнутый мост,в 2 раза больше давления на выпуклый мост?
При какой скорости автомобиля давление,оказываемое им на вогнутый мост,в 2 раза больше давления на...

В папке с поддоменами найти yii, и выполнить команду php yii migrate
Приветствую, форумчане. Не могу разобраться требуется помощь исходные данные есть папка с...

Почему в yii может быть пустым Yii::app()->request->urlReferrer?
Добрый день, Засунул в экшн контроллера (users/registration) такую конструкцию: if(!$role ||...

Как в Yii можно выполнить действие обратное Yii::app()->user->checkAccess('3')?
Руководствовался рецептом yiiframework.ru/doc/cookbook/ru/access.rbac.file . Только изменил ключи...

5
2 / 2 / 0
Регистрация: 24.03.2012
Сообщений: 31
15.03.2013, 19:47 2
Почитайте документацию по phbBB. Покопайтесь в БД форума: выясните где хранятся логины и пароли каким методом они шифруются, а дальше уже по докам к Yii реализуйте авторизацию
0
10 / 10 / 5
Регистрация: 31.01.2012
Сообщений: 98
16.03.2013, 09:32  [ТС] 3
Нашел решение. Выложу здесь, наверняка кому-то пригодится.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
    <?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;
        }
    }
В конфиге добавил:
PHP
1
2
3
4
5
6
7
8
9
        'forumDb'=>array(
            'connectionString' => 'mysql:host=localhost;dbname=yourdb',
            'emulatePrepare' => true,
            'username' => 'root',
            'password' => '',
            'charset' => 'utf8',
            'tablePrefix' => 'phpbb_',
            'class' => 'CDBConnection',
        ),
Eдинственная проблема в этом примере - не работает tablePrefix.

CDbException

CDbCommand не удалось исполнить SQL-запрос: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'yourdb.users' doesn't exist.
Пришлось в БД форума переименовывать таблицу phpbb_users в users. Но это не выход

Может кто-нибудь знает как это пофиксить?
0
508 / 358 / 13
Регистрация: 12.03.2012
Сообщений: 1,896
16.03.2013, 11:22 4
Посмотри на запрос. Добавь параметр префикса.
1
10 / 10 / 5
Регистрация: 31.01.2012
Сообщений: 98
16.03.2013, 11:25  [ТС] 5
Как я не заметил спасибо
0
1 / 1 / 0
Регистрация: 03.08.2012
Сообщений: 21
19.03.2013, 15:01 6
Почитай http://www.elisdn.ru/blog/32/p... hpbb-k-yii, грамотно разжевано.
1
19.03.2013, 15:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.03.2013, 15:01
Помогаю со студенческими работами здесь

Пожалуйста! Игра "Мост". Дан мост с арками разной ширины, в нижней строке экрана расположен мяч, которым можно
Игра &quot;Мост&quot;. Дан мост с арками разной ширины, в нижней строке экрана расположен мяч, которым можно...

Спам на phpBB3
Здравствуйте уважаемые форумчане. Я уже месяц являюсь админом одного форума. На днях я с владельцем...

Помогите опознать диодный мост таймера духовки Hansa BOEM 624000, диодный мост таймера
Помогите опознать диодный мост таймера духовки Hansa BOEM 624000 мост смд маленький примерно...

Шифрование пароля PHPBB3
Имеется скрипт шифрования md5 , нужно переделать его под шифрование которое использует phpbb3...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru