1

Auth および ACL コンポーネントでCakePHP 1.2 を使用しています。

私のユーザー登録アクションでは、パスワードがハッシュ化されていません。具体的には、次の式です。

if ($this->data['User']['password'] !=
    $this->Auth->password($this->data['User']['confirm_password']))

passwordとに同じ値を送信しても、これは true と評価されますconfirm_passwordAuth->passwordへの呼び出しを削除すると、式が false と評価されるため、パスワードがハッシュされていないことはわかっています。

Auth モジュールがパスワードを自動的にハッシュすることを期待していました。私は何を間違っていますか?

これが私の見解です:

<?php
    echo $form->create('User', array('action' => 'register'));

    echo $form->input('email',
                      array('after' => $form->error(
                        'email_unique', 'This email is already registered.')));
    echo $form->input('password');
    echo $form->input('confirm_password', array('type' => 'password'));
    echo $form->end('Register');
?>

ユーザーコントローラーからの登録アクションは次のとおりです。

function register(){
    if ($this->data) {
        if ($this->data['User']['password'] !=
            $this->Auth->password($this->data['User']['confirm_password'])) {

            $this->Session->setFlash(__('Password and Confirm Password must match.', true));
            $this->data['User']['password'] = '';
            $this->data['User']['confirm_password'] = '';
        }
        else{
            $this->User->create();
            if ($this->User->save($this->data)){
                $this->redirect(array('action' => 'index'), null, true);
            }
            else {
                $this->data['User']['password'] = '';
                $this->data['User']['confirm_password'] = '';
                $this->Session->setFlash(__('Some problem saving your information.', true));
            }
        }
    }
}

そして、ここに私がandモジュールappControllerを含める場所があります:AuthAcl

class AppController extends Controller {
    var $components = array('Acl', 'Auth');

    function beforeFilter(){
        if (isset($this->Auth)) {
            $this->Auth->allow('display');
            $this->Auth->fields =
              array(
                'username' => 'email',
                'password' => 'password');
            $this->Auth->authorize = 'actions';
        }
    }
}

私は何を間違っていますか?

4

4 に答える 4

2

ユーザー名に送信された値が含まれていない限り、CakePHPはパスワードをハッシュしません。ユーザー名フィールドをメールに置き換えています。ただし、Auth-> fields配列を設定して、これらのフィールドを再マップしました。しかし、私はuserControllerではなくappControllerでそれを行っていました。したがって、この行を移動します。

$this->Auth->fields = array('username' => 'email', 'password' => 'password');

appControllerからuserControllerにそれを解決しました。
ここで、質問は「appControllerのAuth->フィールドをリセットできないのはなぜですか?」になります。

于 2009-03-06T23:05:22.183 に答える
2

あなたはおそらくAppController::beforeFilter()あなたのUsersController::beforeFilter().

それを「修正」するにparent::beforeFilter()は、関数の先頭に置くだけです。

于 2009-03-23T15:57:20.010 に答える
1

データベースに保存する前に、パスワードをハッシュする必要があります。この関数を User モデルに配置します。

function beforeSave() {
  if(isset($this->data[$this->alias]['password']))
    $this->data[$this->alias]['password'] = Security::hash($this->data[$this->alias]['password'], null, true);
  return true;
}

beforeFilter()そして、これを users コントローラーに入れることを忘れないでください:

if(in_array($this->action, array('register'))) {
  $this->Auth->fields = array('username' => 'email', 'password' => 'wrongfield');
}

つまり、登録プロセス中にパスワードがハッシュされないことを意味します (登録フォームの検証に失敗した場合)。

于 2009-03-06T02:29:53.717 に答える
0

私はあなたが探していると思います

hashPasswords ($data)

これらのページを見てください。彼らはあなたを正しい方向に向けるべきです。コア構成ファイルでデバッグ レベルを変更することもできます。0 (本番) から 3 に変更すると、SQL 出力を確認できます。役立つ場合があります。

AuthComponent-メソッド

Cakephp のトラブルシューティング

申し訳ありませんが、正しい方向に向けることしかできません。私はcakephpが初めてです。

于 2009-03-06T02:02:55.293 に答える