Есть ли лучший способ изменить пароль пользователя в CakePHP с помощью Auth? - PullRequest
14 голосов
/ 19 мая 2010

Я учу торт самостоятельно. Я попытался создать пользовательский контроллер с функцией 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.');
            }
        }
    }
}

пароль - старый пароль, passwordn - новый, password2 - новый пароль. Есть ли какой-нибудь другой, более странный способ сделать это на торте?

Ответы [ 4 ]

29 голосов
/ 20 мая 2010

Я вижу, что вы проверяете и манипулируете данными в контроллере. Делать это в модели, как правило, лучше. Я реализовал подобную функциональность всего несколько дней назад. Мой 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, чтобы подготовить данные для сохранения в базе данных.

21 голосов
/ 04 сентября 2012

Решение, предоставленное Майком, великолепно, но он пропустил функцию "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;
}
0 голосов
/ 03 июня 2014

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

Step1)

$password = $this->Auth->password($this->data['User']['password']); // It will generate the hashed password using the cakephp's Auth component.

Step2)

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'));
}
0 голосов
/ 13 октября 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...