Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony][sfDoctrineGuard]Logowanie a nieaktywne konto.
Forum PHP.pl > Forum > PHP > Frameworki
cyklotrial
Witam!

Przy użyciu pluginu sfDoctrineGuard utworzyłem sobie system użytkowników (rejestracja, logowanie itp).
Niby wszystko działa jak należy ale jedna rzecz cały czas nie daje mi spokoju... Dokładniej rzecz ujmując "nie podobają" mi się komunikaty o błędach podczas logowania.
Dodałem sobie do /lib/form/doctrine plik sfGuardFormSignin.class.php, tam ustawiłem sobie polskie komunikaty o błędach i wszystko byłoby OK gdyby nie brak komunikatu o tym że konto jest nieaktywne.

Podejrzałem sobie co zawiera metoda sfGuardValidatorUser znajdująca się w pliku sfGuardValidatorUser.class.php i ku mojemu zdziwieniu, sprawdzanie czy konto jest aktywne czy też nie, wykonywane jest wraz ze sprawdzaniem poprawności hasła. Skutkuje to tym, że pomimo iż dane podane przez użytkownika podczas logowania są poprawne a jego konto jest nieaktywne, zwracany jest ogólny błąd o niepoprawności loginu/hasła.

W jaki sposób należałoby poprawnie zwrócić błąd o nieaktywnym koncie?
Domyślam się że należałoby nadpisać metodę doClean z pliku sfGuardValidatorUser.class.php, oraz że ingerencja w pliki pluginu to niezbyt dobry pomysł... Gdzie więc należałoby umieścić plik ze zmodyfikowaną metodą doClean
destroyerr
Zazwyczaj staram się odtworzyć strukturę frameworka czy pluginu w swoim projekcie. W związku z czym umieściłbym to w lib/validator/GuardValidatorUser.class.php.
cyklotrial
destroyerr - Dziękuje - ta ścieżka faktycznie jest logiczna.

Ok no to jeszcze jedno pytanko mam do tego tematu smile.gif
W jaki sposób poprawnie zwrócić taki error/wyjątek?

zrobiłem coś takiego:
nadpisałem metode configure:
  1. public function configure($options = array(), $messages = array())
  2. {
  3. parent::configure();
  4. $this->setMessage('inactive', 'To konto jest nieaktywne.');
  5. }


no i w odpowiednim miejscu dodałem sprawdzanie czy konto jest aktywne:
  1. if($user->getIsActive())
  2. {
  3. array_merge($values, array('user' => $user));
  4. }
  5. else
  6. {
  7. throw new sfValidatorError($this, 'inactive');
  8. }



Ale otrzymałem taki oto błąd:
Kod
sfGuardValidatorUser does not support the following error code: 'inactive'.


Co oznacza ten błąd - WIEM, ale niestety moja wiedza na temat SYMFONY jest niestety nadal zbyt mała, abym wiedział jak sprawić, by moj "kod błędu" został przyjęty.

Wszelkie pomysły/sugestie tu bardzo mile widziane.
cyklotrial
destroyerr raz jeszcze dziękuje za pomoc.
Nie wiem jakim cudem ta metoda umknęła mojej uwadze - dwa razy czytałem opis sfValidatorBase withstupidsmiley.gif sciana.gif


Niestety, nadal coś nie działa tak jak powinno sadsmiley02.gif
Ciągle otrzymuje tylko komunikat o nieprawidłowym loginie lub haśle.
Kod metody doClean wygląda tak:
  1. protected function doClean($values)
  2. {
  3. $username = isset($values[$this->getOption('username_field')]) ? $values[$this->getOption('username_field')] : '';
  4. $password = isset($values[$this->getOption('password_field')]) ? $values[$this->getOption('password_field')] : '';
  5.  
  6. $allowEmail = sfConfig::get('app_sf_guard_plugin_allow_login_with_email', true);
  7. $method = $allowEmail ? 'retrieveByUsernameOrEmailAddress' : 'retrieveByUsername';
  8.  
  9. // don't allow to sign in with an empty username
  10. if ($username)
  11. {
  12. if ($callable = sfConfig::get('app_sf_guard_plugin_retrieve_by_username_callable'))
  13. {
  14. $user = call_user_func_array($callable, array($username));
  15. } else {
  16. $user = $this->getTable()->retrieveByUsername($username);
  17. }
  18. // user exists?
  19. if($user)
  20. {
  21. // password is ok?
  22. if ($user->checkPassword($password))
  23. {
  24. //account is active?
  25. if($user->getIsActive())
  26. {
  27. return array_merge($values, array('user' => $user));
  28. }
  29. else
  30. {
  31. throw new sfValidatorError($this, 'inactive');
  32. }
  33. }
  34. }
  35. }
  36.  
  37. if ($this->getOption('throw_global_error'))
  38. {
  39. throw new sfValidatorError($this, 'invalid');
  40. }
  41.  
  42. throw new sfValidatorErrorSchema($this, array($this->getOption('username_field') => new sfValidatorError($this, 'invalid')));
  43. }


Domyślam się jedynie, że linia 42 wysyła ogólny error z kodem "invalid"... Jak sprawić żeby błąd o nieaktywnym koncie został wyświetlony?
destroyerr
Najprawdopodobniej wyjątek z Twoim błędem nie jest w ogóle rzucany. Po kodzie wszystko wygląda ok.
cyklotrial
Chyba sobie jakoś poradziłem z tym problemem. Zastanawiam się tylko czy zrobiłem to we właściwy sposób.

W /lib/form/doctrine utworzyłem plik: sfGuardFormSignin.class.php
  1. class sfGuardFormSignin extends BasesfGuardFormSignin
  2. {
  3. public function configure()
  4. {
  5. parent::configure();
  6. $this->validatorSchema->setPostValidator(new sfGuardValidatorUserCustom(
  7. array('throw_global_error' => true),
  8. 'invalid' => "The email doesn't exist or the password is invalid",
  9. 'inactive' => "This account is inactive")
  10. ));
  11. }
  12. }

W /lib/validator utworzyłem plik: sfGuardValidatorUserCustom.class.php
  1. class sfGuardValidatorUserCustom extends sfValidatorSchema
  2. {
  3. public function __construct($options = array(), $messages = array())
  4. {
  5. $this->addOption('username_field', 'username');
  6. $this->addOption('password_field', 'password');
  7. $this->addOption('throw_global_error', false);
  8.  
  9. $this->addMessage('inactive', 'This account is inactive.');
  10.  
  11. parent::__construct(null, $options, $messages);
  12. }
  13.  
  14.  
  15.  
  16. protected function doClean($values)
  17. {
  18. $username = isset($values[$this->getOption('username_field')]) ? $values[$this->getOption('username_field')] : '';
  19. $password = isset($values[$this->getOption('password_field')]) ? $values[$this->getOption('password_field')] : '';
  20.  
  21.  
  22. // don't allow to sign in with an empty username
  23. if ($username)
  24. {
  25.  
  26. $query = Doctrine_Query::create()
  27. ->from('sfGuardUser')
  28. ->where('username = ?', $username);
  29.  
  30. // Get the user
  31. $user = $query->fetchOne();
  32.  
  33. // user exists?
  34. if($user)
  35. {
  36. // password is ok?
  37. if ($user->checkPassword($password))
  38. {
  39. //account is active?
  40. if($user->getIsActive())
  41. {
  42. return array_merge($values, array('user' => $user));
  43. }
  44. else
  45. {
  46. throw new sfValidatorError($this, 'inactive');
  47. throw new sfValidatorErrorSchema($this, array($this->getOption('username_field') => new sfValidatorError($this, 'inactive')));
  48. }
  49. }
  50. else
  51. {
  52. throw new sfValidatorError($this, 'invalid');
  53. throw new sfValidatorErrorSchema($this, array($this->getOption('username_field') => new sfValidatorError($this, 'invalid')));
  54. }
  55. }
  56. else
  57. {
  58. throw new sfValidatorError($this, 'invalid');
  59. throw new sfValidatorErrorSchema($this, array($this->getOption('username_field') => new sfValidatorError($this, 'invalid')));
  60. }
  61. }
  62. return $values;
  63. }
  64. }


Nie licząc faktu ze takie rozwiązanie działa - Czy jest ono poprawne i ma sens?
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.