sfValidatorDoctrineUnique и sha1 в Symfony? - PullRequest
0 голосов
/ 19 августа 2011

В User.class.php У меня есть:

$this->setCode(sha1($this->getPassword()));

Это нормально. В форме регистрации я хотел бы использовать sfValidatorDoctrineUnique .

$this->validatorSchema->setPostValidator(new sfValidatorDoctrineUnique(array('model'=>'User', 'column'=>'code')));

Но это не работает. Это проверка пароля из формы без sha1 и из базы данных с sha1. Я использую sfValidatorDoctrineUnique также для электронной почты (без sha1), и это работает нормально. Как я могу это исправить? Я использую Symfony 1.4.12

Ответы [ 2 ]

1 голос
/ 19 августа 2011

Какого черта вы проверите, если пароль уникален? это совершенно бессмысленно

UPD: для создания собственного валидатора создайте /lib/valdator/sfValidatorDoctrineFoobar.class.php

<?php

class sfValidatorDoctrineFoobar extends sfValidatorBase
{
  protected function configure($options = array(), $messages = array())
  {
    $this->addMessage('invalid_record', 'Unable to find the related record');
  }

  protected function doClean($value){
    $status = $this->getCodeStatus($value);
    if ($status == 1){
     throw new sfValidatorError($this, 'Code is invalid', array('value' => 'invalid code'));
    }

    if ($status == 2){
     throw new sfValidatorError($this, 'Code allready used', array('value' => 'used'));
    }

    return $value;
  }

  protected function getCodeStatus($value){
    $q = Doctrine_Query::create()->from('Code c');
    $q->select('c.hash, c.used');
    $q->addWhere('c.hash = ?', $value);

    $result = $q->fetchOne(array(), Doctrine::HYDRATE_ARRAY);

    if (!$result) return 1;
    if ($result['used'] == 1) return 2;
    return false;
  }
}

просто чтобы показать вам пример .. вам придется изменить код в соответствии с вашими потребностями;)

0 голосов
/ 19 августа 2011

Symfony имеет встроенную опцию для хэширования ваших паролей. Я думаю, что вы должны использовать это. Вы можете прочитать об этом здесь: sfGuardPlugin . На вашем месте я бы использовал sfDoctrineGuardPlugin в паре с sfForkedDoctrineApplyPlugin . Я использовал это, и он позаботился обо всех этих проблемах.

...