2011-10-22 9 views
0

次のコードはユーザーのパスワードをハッシュすることができず、パスワードをデータベースにクリアテキストで保存します。パスワードを変更した後は、パスワードがハッシュである必要があるため、ログインできません。 次のコードは、私のモデルです。cakephpでパスワードがハッシュされない

'password_confirm'=>array( 
     'compare' => array(
      'rule'  => array('password_match', 'password', true), 
      'message' => 'Password does not match', 
      'required' => true, 
     ), 
     'notempty' => array(
      'rule' => array('notempty'), 
      'message' => 'Confirm password is empty', 
      'allowEmpty' => false, 
      'required' => true) 
    ), 

    'password'=>array(
     'notempty' => array(
      'rule' => array('notempty'), 
      'message' => 'Password is empty', 
      'allowEmpty' => false, 
      'required' => true) 
    ) 

function password_match($data, $password_field, $hashed = true) 
    { 
     $password   = $this->data[$this->alias][$password_field]; 
     $keys    = array_keys($data); 
     $password_confirm = $hashed ? 
       Security::hash($data[$keys[0]], null, true) : 
       $data[$keys[0]]; 
     return $password === $password_confirm; 
    } 

次のコードは、私のuser_controllerに

function change_password(){ 
     #CURRENTLY NOT WORKING 
    $this->layout = "mainLayout"; 
    $in_user_id = $id = $this->Auth->user('id'); 

    if($this->data){ 
     $this->User->validate['password_confirm']['compare']['rule'] = 
     array('password_match', 'password', false); 

     $this->User->set($this->data); 
     $this->User->useValidationRules('ChangePassword'); 
     if($this->User->validates()){ 
      $this->data['User']['id']=$in_user_id; 
      $this->User->save($this->data,array('validate'=>false)); 
     } 
    } 
} 
+0

あなたは「それがクリアテキストでパスワードを保存する」とはどういう意味ですか?私はこの機能のどこにも何も保存すべきではない。 – Farray

+0

'' $ this-> data'の内容は何ですか?その関数に渡すデータについての詳細情報を提供する必要があります。 – xmarcos

答えて

0

であなたのモデルと検証機能は、パスワードのみとconfirm_password入力が一致していることをチェックしています。入力値をハッシュするようにデータを変更することはありません。

入力を検証した後、モデルを保存する前に、パスワード入力をハッシュする必要があります。このような何か:

$this->data[ 'User' ][ 'Password' ] = Security::hash($this->data[ 'User' ][ 'Password' ], null, true); 
+0

これはどこに置かれるべきですか?モデルかコントローラ? –

+0

あなたのコントローラーまたはモデルの['beforeSave'コールバック関数](http://book.cakephp.org/view/1052/beforeSave)で行うことができます。 – Farray

+0

モデルのbeforeSaveがおそらく最適です。 – Ivo

0

あなたは、その自動にcake1.3のフィールド名「パスワード」を使用しないでください。 別のフィールドを使用し、保存する前に名前を変更してください。

あなたはクリーンなアプローチを使用したい場合は、動作を使用することを検討しては: http://www.dereuromark.de/2011/08/25/working-with-passwords-in-cakephp/