Intereting Posts
SQLSTATE : Недопустимый номер параметра: количество связанных переменных не совпадает с числом токенов в строке 102 как выполнять операции с символом оператора, сохраненным в переменной MongoDB / doctrine: не может вложить $ или $ $ Только переменные могут передаваться по ошибке Обновление нескольких столбцов и строк с помощью PDO правильное использование password_hash Laravel Передача данных из одного вида в другой вид Многомерное умножение массива Получить URL-адрес категории в Magento при создании пользовательского меню Предупреждение: mysqli_fetch_assoc () ожидает, что параметр 1 будет mysqli_result, boolean задан в .. Тогда моя строка Неопределенная константа класса 'MYSQL_ATTR_INIT_COMMAND' в константе неопределенного класса (PHP 5.5.3) Объединение нескольких PHP-скриптов в один файл parse_str добавление амперсандов и элементов? Codeigniter Допустимый размер памяти, израсходованный при обработке больших файлов Codeigniter + Angular Js: как получить данные JSON

Пользовательская функция PHP для проверки правильного пароля в Joomla

Я создал скрипт вне Joomla, который может успешно сгенерировать пароль Joomla:

// I copied the JUserHelper class from Joomla here $salt = JUserHelper::genRandomPassword(32); $crypt = JUserHelper::getCryptedPassword($password, $salt); $psw = $crypt.':'.$salt; 

Мой вопрос в том, как я могу сравнить эту новую крипту: salt, которую я генерирую выше, для пароля существующего пользователя в базе данных Joomla и знаю, является ли пароль, предоставленный вышеприведенному скрипту, правильным паролем для этого пользователя в базе данных?

Один из способов – запросить базу данных Joomla напрямую, чтобы получить пароль пользователя (соленый и хешированный), а затем сравнить. Я думаю, что приведенный ниже запрос должен работать для этого, основываясь на том, что я видел из нескольких поисковых запросов Google. Я сделал это в WordPress, поэтому я предполагаю, что Joomla будет похожа.

 select 'password' from `jos_users` WHERE `username` = "Bob"; 

EDIT: Я опубликовал это до того, как был показан предыдущий ответ.

Вы всегда можете разбить сохраненный пароль из соли, поскольку они просто разделены «:»?


Если страница находится вне рамки Joomla, вам нужно будет включить фреймворк, который должен быть выполнен с этим ( ссылка – кодовый блок ниже). Если вы находитесь внутри рамки Joomla, пропустите этот блок. Однако я не тестировал ссылочный код:

 define( '_JEXEC', 1 ); define( 'DS', DIRECTORY_SEPARATOR ); define('JPATH_BASE', dirname(__FILE__).DS."..".DS.".." ); require_once ( JPATH_BASE.DS.'includes'.DS.'defines.php' ); require_once ( JPATH_BASE.DS.'includes'.DS.'framework.php' ); $mainframe =& JFactory::getApplication('site'); $mainframe->initialise(); 

В рамках вам нужно будет искать пользователя по ID или имени пользователя:

 $user =& JFactory::getUser(username or id goes here); 

Тогда, если у вас есть соответствие для $ user, вы можете просто сделать это доступ к этому паролю пользователя:

 $user->password; 

Тогда вы можете просто сравнить с вашим $ psw


Я считаю, что это должно помочь вам на вашем пути.

Вы хотите использовать это для входа пользователя с учетными данными Joomla на внешний сайт или хотите ли вы зарегистрировать их на сайте Joomla?

В joomla 3.4.5:

 if (!class_exists("JFactory")) { define('_JEXEC', 1); define('JPATH_BASE', dirname(__FILE__)); // specify path to joomla base directory here define('DS', DIRECTORY_SEPARATOR); require_once ( JPATH_BASE . DS . 'includes' . DS . 'defines.php' ); require_once ( JPATH_BASE . DS . 'includes' . DS . 'framework.php' ); $mainframe = & JFactory::getApplication('site'); $mainframe->initialise(); } $user = JFactory::getUser(); // or: getUser($id) to get the user with ID $id $passwordMatch = JUserHelper::verifyPassword($entered_password, $user->password, $user->id); 

Мне жаль, что предложенное выше решение является худшим

потому что функция JUserHelper :: genRandomPassword (32) используется для генерации случайных паролей, и каждый раз, когда она генерируется, это будет другой пароль. В другом случае пароль будет сохранен в db при регистрации у пользователя по сравнению с тем, который будет созданный во время проверки, который, очевидно, не будет соответствовать каким-либо образом

Так Joomla 2.5 проверяет пароль

См. Файл плагина: \ plugins \ authentication \ joomla \ joomla.php

 function onUserAuthenticate($credentials, $options, &$response) { $response->type = 'Joomla'; // Joomla does not like blank passwords if (empty($credentials['password'])) { $response->status = JAuthentication::STATUS_FAILURE; $response->error_message = JText::_('JGLOBAL_AUTH_EMPTY_PASS_NOT_ALLOWED'); return false; } // Initialise variables. $conditions = ''; // Get a database object $db = JFactory::getDbo(); $query = $db->getQuery(true); $query->select('id, password'); $query->from('#__users'); $query->where('username=' . $db->Quote($credentials['username'])); $db->setQuery($query); $result = $db->loadObject(); if ($result) { $parts = explode(':', $result->password); $crypt = $parts[0]; $salt = @$parts[1]; $testcrypt = JUserHelper::getCryptedPassword($credentials['password'], $salt); if ($crypt == $testcrypt) { $user = JUser::getInstance($result->id); // Bring this in line with the rest of the system $response->email = $user->email; $response->fullname = $user->name; if (JFactory::getApplication()->isAdmin()) { $response->language = $user->getParam('admin_language'); } else { $response->language = $user->getParam('language'); } $response->status = JAuthentication::STATUS_SUCCESS; $response->error_message = ''; } else { $response->status = JAuthentication::STATUS_FAILURE; $response->error_message = JText::_('JGLOBAL_AUTH_INVALID_PASS'); } } else { $response->status = JAuthentication::STATUS_FAILURE; $response->error_message = JText::_('JGLOBAL_AUTH_NO_USER'); } }