Есть ли лучший способ изменить пароль пользователя в cakephp, используя Auth?
Я сам изучаю торт. Я попытался создать пользовательский контроллер с функцией changepassword. Он работает, но я не уверен, что это лучший способ, и я не мог найти полезные советы по этому вопросу.
Вот мой код:
class UsersController extends AppController {
var $name = 'Users';
function login() {
}
function logout() {
$this->redirect($this->Auth->logout());
}
function changepassword() {
$session=$this->Session->read();
$id=$session['Auth']['User']['id'];
$user=$this->User->find('first',array('conditions' => array('id' => $id)));
$this->set('user',$user);
if (!empty($this->data)) {
if ($this->Auth->password($this->data['User']['password'])==$user['User']['password']) {
if ($this->data['User']['passwordn']==$this->data['User']['password2']) {
// Passwords match, continue processing
$data=$this->data;
$this->data=$user;
$this->data['User']['password']=$this->Auth->password($data['User']['passwordn']);
$this->User->id=$id;
$this->User->save($this->data);
$this->Session->setFlash('Password changed.');
$this->redirect(array('controller'=>'Toners','action' => 'index'));
} else {
$this->Session->setFlash('New passwords differ.');
}
} else {
$this->Session->setFlash('Typed passwords did not match.');
}
}
}
}
пароль - это старый пароль, пароль - новый, пароль2 - новый.
Есть ли какой-нибудь другой, более coomon способ сделать это в пироге?
Ответы
Ответ 1
Я вижу, что вы проверяете и управляете данными в контроллере. Выполнение этого в модели, как правило, является лучшей практикой. Я реализовал аналогичную функциональность всего несколько дней назад. Мой метод change_password()
выглядит примерно так:
# app/controllers/users_controller.php
function change_password() {
if (!empty($this->data)) {
if ($this->User->save($this->data)) {
$this->Session->setFlash('Password has been changed.');
// call $this->redirect() here
} else {
$this->Session->setFlash('Password could not be changed.');
}
} else {
$this->data = $this->User->findById($this->Auth->user('id'));
}
}
И вот урезанная версия представления, используемая с этим методом:
# app/views/users/change_password.ctp
echo $this->Form->create('User');
echo $this->Form->input('id');
echo $this->Form->input('current_password');
echo $this->Form->input('password1');
echo $this->Form->input('password2');
echo $this->Form->end('Submit');
Код, который делает что-то интересное, находится в модели. Я добавил поля из формы в свойство validate
и написал пользовательские методы проверки. Это позволяет мне использовать поля password1 и password2 в любом другом месте приложения, например, в регистрационной форме.
# app/models/user.php
var $validate = array(
'current_password' => array(
'rule' => 'checkCurrentPassword',
'message' => '...'
),
'password1' => array(
'rule' => 'checkPasswordStrength',
'message' => '...',
),
'password2' => array(
'rule' => 'passwordsMatch',
'message' => '...',
)
);
Наконец, в beforeSave()
обратный вызов модели я установил password
в хэш password1
для подготовки данных для его сохранения в базе данных.
Ответ 2
Решение, предоставленное Майком, велико, но он оставил функцию "checkCurrentPassword". Вот пример этой функции, которую вы можете разместить в своей модели:
# app/models/user.php
public function checkCurrentPassword($data) {
$this->id = AuthComponent::user('id');
$password = $this->field('password');
return(AuthComponent::password($data['current_password']) == $password);
}
Это решение получает текущий идентификатор пользователя из компонента Auth и изменяет модель на конкретный пользователь. Затем он сравнивает хэш текущего_паспорта, введенного в форму, с хешированным паролем, хранящимся для этого пользователя.
Кроме того, вот функция beforeSave, которую вы можете использовать для хеширования нового пароля:
# app/models/user.php
public function beforeSave($options = array()) {
if (isset($this->data[$this->alias]['password1'])) {
$this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password1']);
}
return true;
}
Ответ 3
Вы можете использовать последнюю версию плагина cakeDC. Этот плагин предоставляет вам всю функциональность всех функций, связанных с логином, выходом из системы, reset паролем, сменой пароля и т.д. Вы можете найти последнюю версию здесь.
Ответ 4
Вы можете просто использовать: -
Шаг 1)
$password = $this->Auth->password($this->data['User']['password']); // It will generate the hashed password using the cakephp Auth component.
Шаг2)
if($this->User->update(array('User.password'=>$password), array('User.id'=>$this->Auth->User('id')))) {
echo $this->Session->setFlash('Password changed successfully.', 'default',
array('class'=>'successMsg'));
}