我在Joomla之外创建了一个可以成功生成Joomla密码的脚本:
// I copied the JUserHelper class from Joomla here
$salt = JUserHelper::genRandomPassword(32);
$crypt = JUserHelper::getCryptedPassword($password, $salt);
$psw = $crypt.':'.$salt;
我的问题是,如何将这个新的crypt:我在上面生成的盐与Joomla数据库中现有用户的密码进行比较,并知道提供给上述脚本的密码是否是该用户的正确密码。数据库?
答案 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');
}
}