1

私は CakePHP 2.0 を使用しており、サイトのユーザー管理フォームで忙しいです。問題は、データベースからユーザー情報行を呼び出すと、パスワードが暗号化された形式で読み取られ、フォーム要素に長い文字列が入力されることです (暗号化されたパスワードを想定しています)。

保存すると、8 文字に制限されているため、検証規則が壊れます (パスワードの暗号化されたバージョンを保存したくないので、これは良いことです)。

また、フィールドを空白のままにすることはできません。これは、人々が検証ルールを保存して再び失敗する可能性があるためです (パスワードが入力されていません)。

これを克服する最善の方法は何ですか?行に入力されたパスワードを8文字のダミーパスワードに置き換えて検証チェックを行うことを考えましたが、a)誰かが同じパスワードを使用する可能性があり、b)元のパスワードを取得するには別の検索を行う必要があるため、それは機能しませんこれも意味がありません。

何か助けはありますか?

 // Controller EDIT:
 public function edit($id = null) {
    $this->User->id = $id;
    if(!$this->User->exists()) {
       $this->Session->setFlash(__('The user does not exist'));
       $this->redirect(array('action' => 'index'));
    } else {
        if($this->request->is('post') || $this->request->is('put')) {
            if($this->User->save($this->request->data)) {
                $this->Session->setFlash('The user has been updated','default',array('class'=>'success'));
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(__('The user could not be saved. Please, try again.'));
            }
        }
        $this->request->data = $this->User->read(null, $id);
        $userTypes = $this->User->UserType->find("list");
        $userStatuses = $this->User->UserStatus->find("list");
        $this->set(compact("userTypes","userStatuses"));
    }

}

 // HTML Form:
 <?php echo $this->Form->create('User');?>
<fieldset>
    <legend><?php echo __('Modify User '); ?></legend>
    <h3><?php echo $this->Html->link("Return to user index",array("controller" => "users","action" => "index")); ?></h3>
<?php
    echo $this->Form->input('username');
    echo $this->Form->input('password',array("id" => "profilePassword","empty" => true, "autocomplete" => "off"));
    echo $this->Form->input('company');
    echo $this->Form->input('first_name');
    echo $this->Form->input('last_name');
    echo $this->Form->input('telephone');
    echo $this->Form->input('fax');
    echo $this->Form->input('user_status_id');
    echo $this->Form->input('user_type_id');
?>
</fieldset>
 <?php echo $this->Form->end(__('Update'));?>
4

2 に答える 2

2

空の場合はパスワードを設定解除する必要があります (ユーザーが変更したくない場合)

モデルを保存する前に、次を試してください。

if(empty($this->request->data[$this->alias]['password'])) {
    unset($this->request->data[$this->alias]['password']);
}

このようにして、ユーザーがパスワードを変更したい場合は検証され、変更しない場合は更新されず、検証に合格します。また、検証ルールでパスワード フィールドを要求することもできません。そうしないと、ユーザーがパスワードを変更しない場合に合格しません。代わりに、長さ制限などのルールを設定します...

于 2012-09-18T12:46:04.963 に答える
0

params の fields 配列を介して検索呼び出しで取得するフィールドを指定します。単純にパスワード フィールドをフェッチしないでください。これにより、フォームのパスワード フィールドが取り込まれず、リクエスト変数の設定を解除する必要がなくなります。

さらに、上記のことをしたくない場合は、Model::save() 呼び出しでフィールドの名前を指定してください。フィールド配列にパスワード フィールドを入れないでください。

于 2013-09-27T08:14:43.327 に答える