Tworze prosty formularz rejestracyjny dla strony, aby dokonać rejestracji wystarczy podać login i email. Formularz rozszerza sfGuardUserForm.
Ponieważ założenie jest takie, że użytkownik sam nie ustanawia sobie na początku hasła to jest mu ono generowane i zapisywane do bazy.
/* Formularz rejestracji */ $this->form = new RegisterForm(); /* Obsluga danych formularza */ if( $request->isMethod('post') ){ $this->form->bind($request->getPostParameters()); if ($this->form->isValid()) { $user = $this->form->save(); $password = myUser::generatePassword(); $user->setIsActive(false); $user->setPassword($password); $user->save();
... ale to niedziała.
Niedziała w tym sensie, że setPassword() zapisuje przekazane hasło, tak jak zostało ono podane (niezakodowane), do bazy. Jak widać najpierw dane z formularza są zapisywane do bazy (czyli login i hasło), a następnie jest podawane jeszcze hasło i dodtkowy zapis.
Aby nie było generatePassword() zwraca nam jakies losowe hasło (na 100%) w dalszej czesci kodu jest wrzucona implementacja wysylania maila z haslem i dochodzi mail z hasłem.
Pytanie jest takie jak poprawnie wykonywać zmienę hasła użytkownika ?
Wiem że zwracany $user to obiekt klasy
sfGuardUser < PluginsfGuardUser < BasesfGuardUser < sfDoctrineRecord
i nigdzie po drodze niema statycznie zaimplementowanej metody setPassword(), czyli domyślnie jest to tylko najzwyklejsza zmiana wlasciwosci obiektu przez Doctrine (a nie plugin sfDoctrineGuardPlugin).
Sprawdzałem też czy nie ma tej funkcjonalnosci (zapisu zaszyfrowanego hasla) w sfGuardSecurityUser ale tam jest dokladnie to co sam robie
public function setPassword($password, $con = null) { $this->getGuardUser()->setPassword($password); $this->getGuardUser()->save($con); }
Dalej szukałem czy może formularz pluginu nie robi machinacji i nie ustawia poprawnie hasła przy zapisie, czyli klasa
[b]sfGuardUserForm[b] < PluginsfGuardUserForm < BasesfGuardUserForm < BasesfGuardUserForm < BaseFormDoctrine
Ogólnie odpowiedz jest taka, że nie. Czyli plugin który ma być ułatwieniem i powinien posiadać pewną określoną funkcjonalność na starcie wogóle jej nie posiada ? Pola w bazie z algorymem kodowania oraz na sól są, a hasło zawsze niezakodowane.