1

数か月前に CakePHP を試し始めましたが、現在、ログインしているユーザー向けの「パスワード変更ページ」を作成しようとしています。現在のパスワード、新しいパスワード、新しいパスワードの確認のフィールドで構成されるフォームがあります。現在のパスワードについては、ユーザーモデル内のルールとして、ログインしているユーザーのパスワードと一致することを検証したいと考えています。これでログインしているユーザーの情報を取得できることを知っています: AuthComponent::user(). ただし、パスワードを除くモデルのすべてのフィールドが提供されます。

ログインしたユーザーのセッション変数を設定する責任があることはわかっていAuth->login()ますが、パスワードフィールドにのみアクセスできないというここで何が間違っているのかわかりません。

public function login() {

    if ($this->request->is('POST')) {
        if($this->Auth->login()) {
            $this->redirect($this->Auth->redirect());
        } else {
            $this->Session->setFlash('Your username/password combination was incorrect.');
        }
    }
}

これが私のログインビューです:

<h2>Login</h2>
<?php 
echo $this->Form->create('Promoter');
echo $this->Form->input('username');
echo $this->Form->input('password', array('type' => 'password'));
echo $this->Form->end('Login');?>

私は AppController で設定したユーザーとしてプロモーター モデルを使用しています。

public $components = array(
    'Auth'=>array(
        ...
        'authenticate' => array(
            'Form' => array('userModel' => 'Promoter')
        ),
        'authorize' => array('Controller')
    )
);

コントローラーでパスワードを検証することに頼ることができますが、それはあきらめることになります:)問題を明確にするためにさらにコードを提供する必要があるかどうか教えてください。

ありがとう。

4

2 に答える 2

0

おそらく何も悪いことはしていませんが、これはセキュリティ機能である可能性が最も高いです。セッションでパスワードを保持する理由はありません。

第 2 に、たとえセッション中であったとしても、暗号化されます (または、少なくとも暗号化されていることを願っています。暗号化されていない場合は、すぐに変更する必要があります!)。そのため、単純な比較はまだできませんでした。

古いパスワードを比較するには、Promoterモデルにクエリを実行し、そこからハッシュされたパスワードを取得してから、「パスワードの変更」フォームから古いパスワードをハッシュし、最後にハッシュされた結果を比較する必要があります。

于 2012-05-20T13:47:12.507 に答える
0

Cake はパスワードをセッションに保存しないため:

lib/Cake/Component/Auth/BaseAuthenticate.php 行 94

unset($user[$fields['password']]);
于 2012-05-20T00:46:43.980 に答える