Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZF][ZendFramework]Edycja hasła - Zend_Validate_Abstract
Forum PHP.pl > Forum > PHP > Frameworki
tejek
Witam,

Mam problem z edycja konta użytkownika a dokładnie z zmianą hasła z starego na nowe. W formularzu mam 3 pola: Stare hasło: [____] Nowe hasło: [____] Powtórz hasło: [____]. Mój problem jest taki że nie wiem jak mam napisać class-e validatora. Największy problem to taki że nie mogę sprawdzić Doctriną czy wogole istnieje takie hasło w bazie danych bo może ktoś ma takie same, więc musze pobrać id użytkownika i wyszukać go w bazie a następnie pobrać dotychczasowe hasło i porównać jes z hasłem wpisanym w polu formularz Stare hasło. Wyszukanie w bazie to nie problem ale pobranie id użytkownika.

Oto co ma razie udało mi się napisać:
FORMS
  1. class oldpass_available extends Zend_Validate_Abstract
  2. {
  3. protected $_messageTemplates = array
  4. (
  5. 'INVALID' => 'Błędne aktualne hasło.'
  6. );
  7. public function isValid($value)
  8. {
  9. $pass = md5(sha1(Main_Other::pass($value)));
  10.  
  11. $q = Doctrine_Query::create()
  12. ->select('u.user_id')
  13. ->form('MOdel_Users u')
  14. ->where('u.password = ?', $pass)
  15. >limit(1)
  16. ->execute()
  17. ->count();
  18. }
  19.  
  20. }

  1. $this->addElement('password','oldpass',array
  2. (
  3. 'label' => 'Stare hasło',
  4. 'required' => 1,
  5. 'validators' => array
  6. (
  7. //Validator: długość 6-50 znaków
  8. array('StringLength', false, array(6, 50, 'messages' => array
  9. (
  10. 'stringLengthTooShort' => 'Hasło powinno mieć więcej niż %min% znaków',
  11. 'stringLengthTooLong' => 'Hasło powinno mieć mniej niż %max% znaków'
  12. ))),
  13. array('validator'=>new oldpass_available())
  14. //TODO: AJAX sprawdzenie z pass_verify gdy niepuste
  15. )
  16. ));

  1. class Default_Form_Auth_Register extends Zend_Form {
  2. public function init() {
  3. $oldpass = new Zend_Form_Element_Password('oldpass');
  4. $oldpass->setLabel('Stare hasło')
  5. ->addFilter(new Zend_Filter_StringTrim())
  6. ->addValidator(new Zend_Validate_StringLength(6, 50));
  7. //->addValidator(new Main_Validate_Password());
  8. $this->addElement($oldpass);
  9. }
  10.  
  11. }


taro
Pierwsza sprawa, żeby sprawdzić, czy hasło nowe i powtórzenie jest takie same polecam użyć Validatora.

  1. $pass = new Zend_Form_Element_Password('pass');
  2. (...)
  3.  
  4. $pass_repeat = new Zend_Form_Element_Password('pass_repeat');
  5. (...)
  6. ->addValidator('Identical', false, array('pass', 'messages' => array('notSame' => 'Hasła nie są takie same.')));


Co do sprawdzenia, czy takie hasło istnieje w bazie, przychodzi mi na myśl coś takiego:


  1. class CzyStaryEmail_Baza extends Zend_Validate_Abstract {
  2. const MSG_BAZA = 'msgBaza';
  3.  
  4. protected $_messageTemplates = array(
  5. self::MSG_BAZA => "Podano złe hasło."
  6. );
  7.  
  8.  
  9.  
  10. public function isValid($value)
  11. {
  12. $this->_setValue($value);
  13.  
  14. $session = new Zend_Session_Namespace('costam');
  15. $user = new Model_User();
  16. $where[] = "email = '".$session->mail."'";
  17. $where[] = "haslo = '".sha1($value)."'";
  18. $ile = $user->fetchRow($where);
  19.  
  20. if($ile) {
  21. return true;
  22. }
  23. else {
  24. $this->_error(self::MSG_BAZA);
  25. return false;
  26. }
  27. }
  28. }

A w inpucie:
  1.  
  2. $validate_oldmail = new CzyStaryEmail_Baza();
  3.  
  4. $pass_old = new Zend_Form_Element_Password('pass_old');
  5. (...)
  6. ->addValidator($validate_oldmail)
Pilsener
A standardowe walidatory nie wystarczą?
Cytat
Największy problem to taki że nie mogę sprawdzić Doctriną czy wogole istnieje takie hasło w bazie danych bo może ktoś ma takie same, więc musze pobrać id użytkownika i wyszukać go w bazie a następnie pobrać dotychczasowe hasło i porównać jes z hasłem wpisanym w polu formularz Stare hasło
- do soli hasła często dodaje się ID użytkownika, poza tym możesz przecież wykorzystać standardowy walidator db_exists/db_noexists, wystarczy poza hasłem dodać warunek id_usera = nasz user.
I jeśli robimy jakiś walidator wykorzystywany tylko w jednym miejscu, to ja bym radził umieścić go po prostu w formularzu przeciążając metodę is_valid.
zend
@Pilsner, @taro - @tejek wyraźnie napisał, że korzysta z Doctrine, także podane przez was rozwiązania odpadają, ponieważ trzeba by było ładować biblioteki i nawiązywać jeszcze raz połączenie z bazą. Do konstruktora walidatora możesz przekazać identyfikator użytkownika i wykorzystać go w metodzie isValid - ot taki urok obiektówki happy.gif
pawv
Tu przykład Validatora sprawdzającego hasło. Musisz go tylko dostosować do swojej bazy. A samo id użytkownika nie możesz przechwycić ze zmiennej Storage w Zend_Auth?

  1. <?php
  2.  
  3. class My_Validator_CheckValidPassword extends Zend_Validate_Abstract
  4. {
  5. private $_table;
  6. private $_field;
  7. private $_id_user;
  8.  
  9. const OK = '';
  10.  
  11. protected $_messageTemplates = array(
  12. self::OK => "Password is not valid."
  13. );
  14.  
  15. public function __construct($table, $field, $id_user) {
  16. if(is_null(Doctrine_Core::getTable($table)->find($id_user)))
  17. return null;
  18.  
  19. if(!Doctrine_Core::getTable($table)->find($id_user))
  20. return null;
  21.  
  22. $this->_table = Doctrine_Core::getTable($table)->find($id_user);
  23. $this->_field = $field;
  24. }
  25.  
  26. public function isValid($value)
  27. {
  28. $this->_setValue($value);
  29.  
  30. $valuePassword = md5($value.$this->_table->get('salt'));
  31. $userPassword = $this->_table->get('password');
  32.  
  33. if($valuePassword != $userPassword)
  34. {
  35. $this->_error(self::OK);
  36. return false;
  37. }
  38.  
  39. return true;
  40. }
  41. }
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.