2011-08-09 14 views
1

私は事の最も単純なものを私の脳にぶち壊しています。symfonyでsha1()としてのパスワード入力をdbに保存

私はsymfonyで生成されたフォームをカスタマイズしています。私は、 'パスワード'フィールドが通常のフォーマットでパスワードを(期待通りに)書き込むという点を除いて、フォームをちょうど保存しています。

データベースエントリの前にこの値を傍受し、書き込む前にsha1()を呼び出す方法はありますか?

コードは基本的に次のとおりです。

$this->dialog = $request->getParameter('dialog'); 
$this->form = new UserForm(); 

if ($this->getRequest()->getMethod() == "POST") { 
    $this->form->bind($request->getParameter('user')); 
    // intercept here, I suspect 
    $user = $this->form->save(); 
} 

EDIT: 問題は解決しました。

に/lib/model/User.php

クラスユーザーBaseUser {

public function save(PropelPDO $con = null) 
{ 

    if ($this->getPassword() != '') 
    { 
    $this->setPassword(sha1($this->getPassword())); 
    } 

    return parent::save($con); 
} 

}

を拡張これは、のようなnoobのためにかなり明白だが、ではありません私自身。うまくいけば、これは他の誰かを助ける。 save()関数を拡張することなくこれを行うより良い方法があれば教えてください。

リソース:http://www.symfony-project.org/jobeet/1_4/Propel/en/10(参照:トークンで求人フォームを保護)

EDIT#2:Userモデルでこれを行うには良い方法(以下グラードの提案どおり)

public function setPassword($rawPassword) 
{ 
    $salt = "fgv932g2e9dshdfkdjgf927gf8hlz082"; 
    $password = sha1($salt . $rawPassword); 
    parent::setPassword($password); 
} 

答えて

4

それはあなたのUserモデルにsetPassword()機能をオーバーライドしない「より良い」です。

このような何か:あなたはどこからでもパスワードを設定することができ

public function setPassword($rawPassword, $algo = 'sha1', $salt = null) { 
    if ($salt === null) { 
    $salt = sha1(time().rand().$this->id.$this->username); 
    } 
    $password = hash($algo, $rawPassword.$salt); 
    $this->_set('password', $password); 
    $this->_set('password_algo', $algo); 
    $this->_set('password_salt', $salt); 
} 

この方法で(あなたの現在のソリューションは、唯一の新しいユーザーのために動作します)。

(そして、サイドノートに:。:-)塩にあなたのパスワードを忘れないでください)

+0

こんにちはグラード!有難うございます。とても明らか!しかし、私は少しあなたの機能を更新しました、より良いアイデアと思われる(はい、機能は非常に塩味です!);)...元の記事を参照してください! – David

+0

塩をデータベースに保存して、それをユーザーごとに動的にすると、それをさらに塩味にすることができます;-) (私の更新されたコードを参照してください) –

+0

笑!あまりにも多くの塩があなたの健康に悪いです、あなたは知っている... hehe! :) – David

関連する問題