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.

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.

Buďme ve spojení, přihlaste se k newsletteru

Odesláním formuláře souhlasíte s podmínkami zpracováním osobních údajů. 
Více informací v Ochrana osobních údajů.

Autor článku: Jan Polzer

Tvůrce webů z Brna se specializací na Drupal, WordPress a Symfony. Acquia Certified Developer & Site Builder. Autor několika knih o Drupalu.
Marketing Director v Lesensky.cz. Ve volných chvílích podnikám výlety na souši i po vodě. Více se dozvíte na polzer.cz a mém LinkedIn profilu.

Komentáře k článku

návštěvník

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

návštěvník

Dobrý den možná se ptám jako úplný analfabet, ale kde najdu složku resp. název dokumentu kde změním heslo
Drupal 7 mám přístup pouze přes FTP. Asi jsem si heslo špatně zkopíroval a nyní se nemohu přihlásit :-(
1.
$account = user_load(1);
2.
$edit['pass'] = 'NOVE HESLO';
3.
user_save($account, $edit);
Děkuji za odpověď

Profile picture for user Jan Polzer

Dobrý den, jednoduše. Dejte to třeba na konec index.php a načtěte web. Tím se to aktivuje. Pak to odmažte a je to.

návštěvník

Děkuji mnohokrát

Přidat komentář

Odesláním komentáře souhlasíte s podmínkami Ochrany osobních údajů

reklama
Moje kniha o CMS Drupal

 

Kniha 333 tipů a triků pro Drupal 9


Více na KnihyPolzer.cz

Sledujte Maxiorla na Facebooku

Maxiorel na Facebooku

Poslední komentáře
Nové diskuze
Hosting pro Drupal a WordPress

Hledáte český webhosting vhodný nejenom pro redakční systém Drupal? Tak vyzkoušejte Webhosting C4 za 1200 Kč na rok s doménou v ceně, 20 GB prostoru a automatické navyšováním o 2 GB každý rok. Podrobnosti zde.

@maxiorel na Twitteru

Maxiorel na Twitteru