2011-11-04 2 views
3

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

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

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

ответ

1

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

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

Да, но как вы это делаете сравнение? Это не так просто, как сравнение двух строк, потому что строчка crypt: salt, генерируемая из слова, будет вызывать разные строки каждый раз, несмотря на то, что каждый раз предоставляется один и тот же пароль, поэтому он никогда не будет == что находится в базе данных ... Я предполагаю, что есть способ написать функцию, которая будет правильно выполнять сравнение. – lioman

+1

Если я правильно понимаю ... не мог ли вы получить сохраненный пароль для пользователя, который также даст вам соль? Затем вы разделяете строку на «:», а задняя половина - соль, а фронт - склеп. Затем вызовите свой код выше с полученным значением соли, чтобы сгенерировать возможный крипт, и посмотрите, совпадает ли сгенерированное значение склепа с передней частью строки пароля из базы данных. – Bryan

+0

Спасибо, я не знал, что использование сохраненной соли БД с моим кодом woud приведет к созданию соответствующего склепа. – lioman

3

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

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


Если страница находится вне рамок Joomla вам нужно будет включать в себя структуру, которая должна быть в состоянии осуществить с этим (reference - кодоблок ниже). Если вы находитесь внутри рамки 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->password; 

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


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

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

+0

Спасибо за код, я сначала хотел просто выполнить проверку пароля, не заимствуя рамки Joomla, но я вижу, что это необходимо. Это также было полезно, так как вход в систему пользователя - это мой следующий шаг. – lioman

+0

Для регистрации пользователя вам нужно что-то вроде этого: '$ credentials ['username'] = $ user-> username;' '$ credentials ['password'] = $ user-> password;' '$ mainframe-> login ($ credentials);' Если вы посмотрите на источник плагина аутентификации Joomla, вы увидите, что он принимает учетные данные в ассоциативном массиве. Извините, у меня были проблемы с форматированием кода. – aupdo

0

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

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

0

Это как Joomla 2.5 Подтверждает пароль

Смотрите файл плагина: \ Plugins \ аутентификации \ 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'); 
     } 
    } 
2

В 3.4.5 Joomla:

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); 
Смежные вопросы