web-dev-qa-db-fra.com

Créer un utilisateur Joomla en dehors de Joomla

Pour diverses raisons, je dois créer un utilisateur Joomla hors de Joomla. Suivant les conseils, j'utilise passwordhash.php pour le hachage, donc j'utilise quelque chose comme:

$t_hasher = new PasswordHash(10, TRUE);
$jpassword = $t_hasher->HashPassword($rsnew["password"]); 

Ajoutez ensuite directement un enregistrement contenant le nom, l’email, le nom d’utilisateur et ce mot de passe haché dans la table Joomla ..._ users. (J'ajoute également l'enregistrement correspondant dans la table ..._ user_usergroup_map)

L'enregistrement a l'air bien dans la base de données mais je ne peux pas me connecter - "Le nom d'utilisateur et le mot de passe ne correspondent pas ou vous n'avez pas encore de compte."

Cependant, je peux m'authentifier avec succès depuis un programme externe sur la table des utilisateurs Joomla ..._ en utilisant quelque chose comme ...

$mysql = "SELECT password FROM jos_users WHERE username = '".$usr."'";
   $t_hasher = new PasswordHash(10, TRUE);
   if ($t_hasher->CheckPassword($pwd, $mydb->get_var($mysql))) {
      return TRUE;
          .........

Évidemment, le hachage de mot de passe stocké est correct d'une certaine manière sinon je ne serais pas capable de l'authentifier de l'extérieur mais pourquoi Joomla ne l'accepte-t-il pas?

(Si je vais dans l'administrateur Joomla et que je change le mot de passe, je peux m'authentifier correctement depuis Joomla.)

Toutes les idées Merci

1
SteveG

Vous devez utiliser les fonctions internes de Joomla pour créer et gérer des comptes utilisateur.

Voir la réponse ici: https://stackoverflow.com/questions/1904809/how-can-i-create-a-new-joomla-user-account-from-within-a-script

Implémentation du framework Joomla et ajout d'un nouvel utilisateur (# 4- # 8): https://diadem.in/blog/two-ways-to-add-joomla-users-using-your-custom-code/

Je fais quelque chose comme ça dans mes composants pour générer le hash du mot de passe:

$salt = JUserHelper::genRandomPassword(32);
$crypt = JUserHelper::getCryptedPassword('your_password', $salt);
$password_hash = $crypt.':'.$salt;

Script pour créer un utilisateur (testé J3.7.x):

define( '_JEXEC', 1 );
define('JPATH_BASE', dirname(__FILE__) );//this is when we are in the root
define( 'DS', DIRECTORY_SEPARATOR );

require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );

$app = JFactory::getApplication('site');
$app->initialise();

$params = array(
    'name'=>'test',
    'username'=>'test_user',
    'email'=>'[email protected]',
    'password'=>'test',

);

$udata = array(
    'name'=>$params['name'],
    'username'=>$params['username'],
    'password'=>$params['password'],
    'email'=>$params['email'],
    'groups'=>array(2), // set the usergroup(s) here (id)

);

$user = new JUser;

try{
    echo '<pre>';
    echo 'Bind user data: ';
    var_dump($user->bind($udata));         

    echo 'Save user data: ';
    var_dump($user->save());

    echo 'Testing login: ';
    var_dump( $app->login( array('username'=>$params['username'],'password'=>$params['password']) ) );

} catch (Exception $ex) {

    echo 'Exception: ',  $e->getMessage(), '\n';

}

Comme vous pouvez le constater, il n’est pas nécessaire de hacher le mot de passe au préalable.

3
Dennis Heiden