Я создал скрипт вне 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'); } }