0

ユーザーログインシステムを備えたシンプルなCakePHPアプリを構築し、Milesj.meによるCake Formプラグインを接続しました(それが問題を引き起こしているかどうかはわかりません)。

ただし、私の検証は、サインアップ フォームだけでなくログイン フォームにも適用されているようです。そのため、ログインしようとすると、「ユーザー名は既に使用されています」などのエラーが表示されます。

これを引き起こす原因は何ですか?認証フォームにも検証を追加する CakePHP で何か変更がありましたか?

また、モデルでパスワードをハッシュする必要があるのはなぜですか? 私は、CakePHP がパスワードを自動的にハッシュしたという印象を受けましたか? そして、私は以前にそれをする必要はありませんでした。ただし、そうしないと、ハッシュ化されずにパスワードがDBに保存されていました...

ここに私のビュー、コントローラー、モデルがあります:

<?php echo $this->Form->create(); ?>

    <?php echo $this->Form->input('User.username',
    array('tabindex'=>1, 'autofocus',
    'label'=>array('class'=>'placeholder','text'=>'Username'))); ?>

    <?php echo $this->Form->input('User.password',
    array('tabindex'=>2, 'type'=>'password',
    'label'=>array('class'=>'placeholder','text' =>'Password' ))); ?>

    <div class="input button">
        <button class="orangeButton" tabindex="3" type="submit"><span class="icon login">Log in</span></button>
    </div>

<?php echo $this->Form->end(); ?>

コントローラ:

public function login() {
    if ($this->request->data) {
        $this->User->set($this->request->data);

        if ($this->User->validates() && $this->Auth->login()) {
            if ($user = $this->Auth->user()) {
                $this->User->Profile->login($user['id']);
                $this->Session->delete('Forum');

                $this->redirect($this->referer());
            }
        }
    }
}

注: ログインのための Profile モデルの呼び出しは、最後にログインしたときのデータやその他のものを保存するだけで、実際には認証に関しては何もしません!

そしてモデル:

class User extends AppModel {

    public $name = 'User';

    public $hasOne = array(
        'Profile' => array('className' => 'Forum.Profile')
    );

    public $hasMany = array(
        'Access' => array('className' => 'Forum.Access'), 
        'Moderator' => array('className' => 'Forum.Moderator')
    );

    public $validate = array(
        'email' => array(
            'required' => array(
                'rule' => array('notEmpty'),
                'message' => 'A valid email address is required'
            ),
            'email' => array(
                'rule' => array('email'),
                'message' => 'This is not a valid email address'
            ),
            'unique' => array(
                'rule' => array('isUnique'),
                'message' => 'This email is already in use'
            )
        ),
        'username' => array(
            'required' => array(
                'rule' => array('notEmpty'),
                'message' => 'A username is required'
            ),
            'unique' => array(
                'rule' => array('isUnique'),
                'message' => 'This username is already in use'
            ),
            'alphaNumeric' => array(
                'rule' => array('alphaNumeric'),
                'message' => 'Usernames must only contain letters and numbers'
            ),
            'between' => array(
                'rule' => array('between', 4, 20),
                'message' => 'Usernames must be between 4 and 20 characters long'
            )
        ),
        'password' => array(
            'required' => array(
                'rule' => array('notEmpty'),
                'message' => 'A password is required'
            )
        )
    );


    public function beforeSave()
    {
        if (isset($this->data[$this->alias]['password']))
        {
            $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']);
        }
        return true;
    }
4

2 に答える 2

1

検証ルールに追加するだけ'on' => 'create'

http://book.cakephp.org/2.0/en/models/data-validation.html#on

于 2012-12-02T18:24:22.743 に答える
0

cakephpによる

デフォルトでフィールドごとに複数のルールがある場合、特定のルールが失敗すると、そのルールのエラーメッセージが返され、そのフィールドの次のルールは処理されません。

ただし、最初のルールが失敗しない場合は、2番目のルールの評価を続行します。

次の方法で特定の検証を削除できます

$this->validator()->remove('username', 'unique');
于 2012-12-02T16:02:13.103 に答える