2011-08-19 53 views
0

User.class.php我有:sfValidatorDoctrineUnique和sha1在Symfony中?

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

這是確定。以註冊形式,我想使用sfValidatorDoctrineUnique

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

但是這不起作用。這個檢查來自沒有sha1的表單和來自sha1的數據庫的密碼。我使用sfValidatorDoctrineUnique也用於電子郵件(沒有sha1),這工作正常。 我該如何解決它?我使用Symfony 1.4.12

回答

1

爲什麼你會檢查密碼是否是唯一的?這使得完全沒有意義

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

我需要這個。我必須使這也爲用戶的唯一代碼。 –

+2

然後再添加一些熵:-)像$ this-> setCode(sha1($ this-> getPassword()。$ this-> getId()。$ this-> getUsername()。time())); –

+0

我可以做到這一點。我將修改驗證器唯一原則 –

0

Symfony有一個用於散列密碼的內置選項我認爲你應該使用它。你可以在這裏閱讀:sfGuardPlugin。如果我是你,我會使用sfDoctrineGuardPluginsfForkedDoctrineApplyPlugin一起使用。我正在使用它,它處理了所有這些問題。

+0

我想這也代碼,不僅爲密碼 –

+0

然後,你應該寫一個自定義驗證。 –

+0

但是如何?任何例子? –