Лучший способ обработки формы с полем пароля в CakePHP 1.3?

У меня есть пользовательский контроллер и пользовательская модель. Эта модель и связанная таблица базы данных используются для аутентификации и, естественно, есть поле пароля.

В моем действии edit, когда я вызываю $this->data, хешированный пароль помещается в поле моего пароля в моем представлении edit. Естественно, мне не нужно поле пароля с 40-символьным значением, которое затем будет повторно хэшироваться при сохранении.

Мои действия выглядят так:

function edit($id) {
    $this->User->id = $id;
    if (empty($this->data)) {
        $this->data = $this->User->read();
    }
    else {
        if ($this->User->save($this->data)) {
            $this->Session->setFlash('User has been updated.');
            $this->redirect(array('action' => 'view', $this->User->id));
        }
    }
}

И мой взгляд выглядит так:

<h2>Edit User</h2>
<?php
    echo $this->Form->create('User', array('action' => 'edit'));
    echo $this->Form->input('username');
    echo $this->Form->input('password');
    echo $this->Form->input('first_name');
    echo $this->Form->input('last_name');
    echo $this->Form->input('email');
    echo $this->Form->end('Save User');
?>

Как сделать так, чтобы пользователи могли редактировать свою учетную запись (имя пользователя и т. д.), которая не обновляет пароль, если он оставлен пустым, но обновляет его, если пользователь вводит новый пароль в поле пароля?


person Martin Bean    schedule 02.08.2011    source источник


Ответы (2)


Обычный и наиболее безопасный метод — создать отдельную форму для смены пароля, в которой вы просите пользователя подтвердить изменение, запросив старый пароль. Это потому, что если вы забудете открыть сайт на общедоступном компьютере, следующий человек, который войдет, не сможет просто захватить учетную запись, просто введя новый пароль.

Если вы все еще хотите использовать исходный план, вы можете отключить переменную, если она пуста, перед сохранением данных:

if( $this->data[ 'User' ][ 'password' ] == '' ) {
    unset( $this->data[ 'User' ][ 'password' ] );
}

Другой вариант — перечислить разрешенные поля в качестве параметра для save() и пропустить password, если поле пусто.

В представлении вы можете использовать

echo $this->Form->input('password', array( 'value' => '' ) );

чтобы хэш не отображался в поле.

person JJJ    schedule 02.08.2011
comment
Конечно! Спасибо. Я зайду в отдельную форму для смены пароля. - person Martin Bean; 02.08.2011
comment
Как правило, форма редактирования пользователя не обрабатывает пароли, а действие, связанное с редактированием, даже не допускает ввода поля пароля с помощью клавиши поля в вызове сохранения. Пока для проверки поля пароля НЕ установлено значение required => true (это означает, что оно должно быть в массиве данных для сохранения пользователя) и поле просто отсутствует в общей форме редактирования, все будет в порядке. - person Abba Bryant; 02.08.2011
comment
используйте поведение для чистого подхода: github.com/dereuromark/ инструменты/блоб/мастер/модели/поведения/ - person mark; 03.08.2011

В большинстве мест редактирование паролей разрешено только при вводе исходных паролей. Это помогает защититься от изменения пароля при несанкционированном доступе.

Но если ты хочешь это сделать, попробуй

echo $this->Form->input('password', array('default'=>false));
person user875254    schedule 02.08.2011
comment
Выполнение только этого очистит пароль в базе данных, когда поле останется пустым. - person JJJ; 02.08.2011