autorizace zalozeni usera
- talpa
- Člen | 44
ahoj tak jsem si zacal tvorit aplikaci, zvesela si tak busim formulare, rikam si jak mi to krasne jde a pak delam form na zmenu hesla a zaboha nevim jak to v te sve modularni aplikaci udelat, pouzil jsem navod na modularni aplikaci s administracnim modulem, coz o to, ale nejak se to tam overuje vuci nahodnemu stringu a hashi, ci co nejak jsem to nepobral, vysvetlite mi to?
Pripadne ukazka jak udelat zmenu hesla zadaneho uzivatelem? Diky moc Ales
- toka
- Člen | 253
Situace není popsaná dost dobře, ale snad jsem ji porozuměl. Pokusím se o takový náznak, z hlavy – takže takový nástin (něco jsem tu poskládal :-)), nezkoušeno:
// ---------------------------------------------------------------------------
protected function createComponentFormPassword() {
$form = new AppForm;
$form->addPassword('current_password', 'Staré heslo:')
->addRule(Form::FILLED, 'Zadejte staré heslo');
$form->addPassword('new_password', 'Nové heslo:')
->addRule(Form::FILLED, 'Zadejte nové heslo')
->addRule(Form::MIN_LENGTH, 'Zadané heslo je příliš krátké, zvolte si heslo alespoň o %d znacích', 8);
$form->addPassword('new_password2', 'Nové heslo (ověření):')
->addRule(Form::FILLED, 'Zadejte nové heslo ještě jednou, pro kontrolu')
->addRule(Form::EQUAL, 'Zadané hesla se neshodují', $form['new_password']);
$form->addSubmit('submitted', 'Změnit heslo');
$form->onSubmit[] = array($this, 'formPasswordSubmitted');
return $form;
}
// ---------------------------------------------------------------------------
public function formPasswordSubmitted($form) {
...
if($return = $this->model->updatePassword($formValues)) {
$this->flashMessage('Heslo bylo změněno', 'success');
$this->redirect(':IS:Settings:password');
} else {
if($return == -1) $this->flashMessage('Zadané heslo není správné', 'error');
else $this->flashMessage('Heslo se nepodařilo změnit', 'error');
}
...
}
// ---------------------------------------------------------------------------
public function getPassword($login) {
$r = $this->db->select('[uzivatel].[heslo]')
->from('[uzivatel]')
->where('[uzivatel].[login]=%s', $login)
->fetch();
return $r['heslo'];
}
// ---------------------------------------------------------------------------
public function updatePassword($vals) {
$r = TRUE;
$password = $this->getPassword(Environment::getUser()->getIdentity()->getName());
if($password == hash('sha256', $vals['current_password'])) {
$uzivatel = array(
'heslo' => hash('sha256', $vals['new_password']),
);
if(!$this->db->query('UPDATE [uzivatel] SET ', $uzivatel, ' WHERE [login] = %s', Environment::getUser()->getIdentity()->getName())) $r &= FALSE;
return $r;
} else {
return -1;
}
}
Snad to je pochopitelné, v případě, že používáš jinou hashovací funkci, tak si to v kódu uprav.
Editoval toka (5. 5. 2010 11:10)
- dotTwelve
- Člen | 167
Používá se funkce z php – hash_hmac
a to tak, že se naplní potřebnými
údaji ;-)
Ja tu funkci plním ve formuláři na resetování původního hesla například takto:
<?php
$config = Environment::getConfig('security');
$password = $this->random(6);
$values['salt'] = $this->random(10);
$values['password'] = hash_hmac('sha256', $password . $values['salt'], $config->hmacKey);
?>
kde hmac-klíč načítám z konfiguračního souboru config.ini
security.hmacKey = tadySiZvolíšKlíčJakýChceš
, dále mám
napsanou funkci, která mi generuje náhodný string jako heslo a to heslo
ještě pro jistotu osolíš nějakým dalším stringem, který taky náhodně
generuju.
Jo a pokud to chceš nechat na uživateli změnu hesla, tak holt budeš mít proměnnou $password vytaženou z formuláře.
Editoval dotTwelve (5. 5. 2010 15:19)