自定义PHP函数以验证Joomla中的正确密码

时间:2011-11-04 20:04:18

标签: php joomla passwords

我在Joomla之外创建了一个可以成功生成Joomla密码的脚本:

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

我的问题是,如何将这个新的crypt:我在上面生成的盐与Joomla数据库中现有用户的密码进行比较,并知道提供给上述脚本的密码是否是该用户的正确密码。数据库?

5 个答案:

答案 0 :(得分:3)

编辑:我在上一个回复显示之前发布了这个。

您可以随时将存储的密码与盐分开,因为它们只是以':'分隔?


如果页面在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匹配,您只需访问该用户的密码:

$user->password;

然后你可以与你的$ psw

进行比较

我相信这应该会帮助你。

您是否希望使用此功能将用户使用Joomla凭据登录到外部网站,或者您是否希望将其登录到Joomla网站?

答案 1 :(得分:2)

在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);

答案 2 :(得分:1)

一种方法是直接查询Joomla数据库以获取用户的(盐渍和散列)密码,然后进行比较。我认为以下查询应该适用于此,基于我从一些谷歌搜索中看到的。我在Wordpress中做过这个,所以我假设Joomla会有类似的。

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

答案 3 :(得分:0)

我很遗憾地说上面提出的解决方案是最糟糕的

  
    
      

因为JUserHelper :: genRandomPassword(32)函数用于生成随机密码,每次生成密码时都会生成不同的密码       所以不同的密码将在与用户注册时保存在数据库中,与在检查时生成的密码相比,显然不会以任何方式匹配

    
  

答案 4 :(得分:0)

这是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');
        }
    }