CakePHP認証コンポーネントがパスワードをハッシュしないのはなぜですか?
-
03-07-2019 - |
質問
CakePHP 1.2でAuthおよびACLコンポーネントを使用しています。
ユーザー登録アクションでは、パスワードがハッシュ化されずに届きます。具体的には、次の式:
if ($this->data['User']['password'] !=
$this->Auth->password($this->data['User']['confirm_password']))
password
と confirm_password
に同じ値を送信しても、これはtrueと評価されます。 Auth-> 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));
}
}
}
}
そして、ここに私の appController
に Auth
および Acl
モジュールを含めます:
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';
}
}
}
何が間違っているのですか?
解決
CakePHPは、ユーザー名に送信された値が含まれていない限り、パスワードをハッシュしません。ユーザー名フィールドをメールに置き換えています。ただし、Auth-&gt; fields配列を設定して、これらのフィールドを再マップしました。ただし、userControllerではなくappControllerで実行していました。したがって、この行を移動します:
$this->Auth->fields = array('username' => 'email', 'password' => 'password');
appControllerからuserControllerに解決しました。
ここで、質問は&quot; appControllerのAuth-&gt;フィールドをリセットできないのはなぜですか?&quot;になります
他のヒント
UsersController :: beforeFilter()
で AppController :: beforeFilter()
をオーバーライドしている可能性があります。
「修正」するには関数の先頭に parent :: beforeFilter()
を置くだけです。
データベースに保存する前にパスワードをハッシュする必要があります。この関数をユーザーモデルに配置します。
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()
に入れることを忘れないでください:
if(in_array($this->action, array('register'))) {
$this->Auth->fields = array('username' => 'email', 'password' => 'wrongfield');
}
これは、登録プロセス中にパスワードがハッシュされないことを意味します(登録フォームの検証に失敗した場合)。
探していると思う
hashPasswords ($data)
これらのページをご覧ください。彼らはあなたを正しい方向に向けるべきです。コア構成ファイルでデバッグレベルを変更してみることもできます。 0(実稼働)から3に変更すると、SQL出力を確認できます。役立つかもしれません。
申し訳ありませんが、私はあなたを正しい方向に向けることしかできません。 cakephpは初めてです。