ユーザーログインシステムを備えたシンプルな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;
}