Jak resetovat heslo v Drupalu, když nefungují maily

Několikrát jsem pro klienty a kamarády řešil situaci, kdy se nemohli přihlásit do Drupalu, protože zapomněli heslo. Z webu navíc neodcházely e-maily, takže ani nebylo možné získat odkaz pro jednorázové přihlášení. Vždy je však nějaká cesta.

Reklama

Situace, kdy se vám výše popsané stane, jsou různé. Ono stačí, aby klient změnil heslo, pak se o web nestaral a po nějaké době zjistil, že potřebuje nějakou změnu. Nedovede se ale přihlásit a hosting zablokoval posílání zpráv kvůli spamu. Nebo je zapnutý odesílač přes SMTP, který je špatně nastavený. Je zkrátka mnoho příčin, kdy potřebujete zresetovat heslo do Drupalu a nejde to klasickou cestou.

V takovém případě vám nezbude nic jiného než sáhnout do databáze. Nebo jinak. Napadají mě dvě možnosti. Programově vytvořit jiného uživatele, přidělit mu administrátorská práva, přihlásit se s ním a heslo pro hlavního správce tam resetovat.

V tomto článku se ale zaměřím na způsob, jak získat zahashovanou podobu hesla, kterou pak můžete vložit do databáze.

Jak změnit heslo v databázi v Drupalu 6

Drupal 6 je sice už historie, není podporován, ale přesto se na mě obrací řada lidí, kteří jej chtějí převést na vyšší verzi. Možná naopak právě proto, nevím. Každopádně pokud byste popsanou situaci řešili v Drupalu 6, je to velmi snadné.

V jeho době byla hesla uložena jen jako kalkulace md5. Stačí tedy následující:

Jak na změnu hesla v databázi Drupalu 7

MD5 není samo o sobě žádná bezpečnostní výhra, takže s příchodem Drupalu 7 už došlo ke změně a takto jednoduše nové heslo do databáze nedostanete.

K vytváření zahashovaného hesla používá Drupal 7 funkci user_hash_password(). Kouknete-li do nápovědy na Drupal API, tak zjistíte, že tato funkce kryptuje heslo pomocí SHA-512 a tzv. jej osolí. Onu sůl už do nějakých generátorů moc jednoduše nedostanete, takže si musíte poradit jednoduchým kusem kódu.

Vytvořte si v kořenové složce Drupalu nový soubor heslo.php a vložte do něj následující kód.

<?php

define('DRUPAL_ROOT', getcwd());

require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);


require('includes/password.inc');

echo user_hash_password('TADY_NAPIŠ_SVOJE_NOVÉ_HESLO'); 
die();

menu_execute_active_handler();

Poté, co otevřete v prohlížeči adresawebu/heslo.php, zobrazí se vám zashashovaná podoba hesla. A tu již můžete přes databázového správce vložit do tabulky users a sloupečku pass na řádku, který se týká konkrétního uživatele.

Případně to můžete udělat přímo v kódu a možná o něco elegantněji. Stačí nahradit řádky s napojením password.inc a zobrazením hesla za:

$account = user_load(1);
$edit['pass'] = 'NOVE HESLO';
user_save($account, $edit);

Jak to má s heslem v databázi Drupal 8?

Na závěr samozřejmě nesmím zapomenout na Drupal 8. Zřejmě by se to dalo vyřešit opět načtením nějaké entity uživatele na základě jeho identifikátoru a poté uložením přes $user->setPassword(), nicméně je tu elegantnější řešení. Ve složce core/scripts najdete soubor password-hash.sh. Stačí jej na příkazovém řádku spustit a jako parametr uvést nové heslo. Skript vám vrátí jeho zahashovanou podobu, kterou můžete vložit do databáze.

Reklama

Komentáře

Pro Drupal6 neni potreba hledat zadny "kalkulator MD5" protoze tu funkci umi samo MySQL(neznam nikoho kdo by pouzival Drupal na SQLite)...

Neznám = neexistuje? ;-)

Majitel Maxiorla. Nabízím mimo jiné placené poradenství pro Drupal. Jsem i na Twitteru.

Přidat komentář