проверка пароля - PullRequest
       9

проверка пароля

7 голосов
/ 21 сентября 2010
var $validate = array(
  'password' => array(
      'passwordlength' => array('rule' => array('between', 8, 50),'message' => 'Enter 8-50 chars'),
      'passwordequal' => array('checkpasswords','message' => 'Passwords dont match') 
  )
);

function checkpasswords()
{
   return strcmp($this->data['Airline']['password'],$this->data['Airline']['confirm password']);
}

Этот код не работает и всегда выдает сообщение об ошибке, даже если они совпадают.Также, когда я делаю правку, я получаю следующую ошибку, так как нет поля пароля.есть ли какое-то исправление

Undefined index:  password [APP/models/airline.php, line 25]

Ответы [ 6 ]

12 голосов
/ 21 сентября 2010

Используете ли вы AuthComponent? Помните, что он хэширует все входящие поля пароля (но не поля «подтверждение пароля», проверьте с помощью debug($this->data)), поэтому поля никогда не будут одинаковыми. Прочтите руководство и используйте AuthComponent::password для проверки.


Сказав это, вот что я использую:

public $validate = array(
    'password' => array(
        'confirm' => array(
            'rule' => array('password', 'password_control', 'confirm'),
            'message' => 'Repeat password',
            'last' => true
        ),
        'length' => array(
            'rule' => array('password', 'password_control', 'length'),
            'message' => 'At least 6 characters'
        )
    ),
    'password_control' => array(
        'notempty' => array(
            'rule' => array('notEmpty'),
            'allowEmpty' => false,
            'message' => 'Repeat password'
        )
    )
);

public function password($data, $controlField, $test) {
    if (!isset($this->data[$this->alias][$controlField])) {
        trigger_error('Password control field not set.');
        return false;
    }

    $field = key($data);
    $password = current($data);
    $controlPassword = $this->data[$this->alias][$controlField];

    switch ($test) {
        case 'confirm' :
            if ($password !== Security::hash($controlPassword, null, true)) {
                $this->invalidate($controlField, 'Repeat password');
                return false;
            }
            return true;

        case 'length' :
            return strlen($controlPassword) >= 6;

        default :
            trigger_error("Unknown password test '$test'.");
    }
}

Это плохо по следующим причинам:

  • Имеет тесную связь с формой, всегда ожидает наличие поля password_control. Вам нужно использовать белый список полей или отключить проверку, если у вас ее нет в ваших данных, т.е. $this->User->save($this->data, true, array('field1', 'field2')).
  • Вручную хэширует пароль, как это делает AuthComponent (поскольку нет чистого доступа к компонентам из модели). Если вы измените алгоритм, используемый в AuthComponent, вам необходимо изменить его и здесь.

Сказав это, он прозрачно проверяет и выдает правильные сообщения об ошибках как для пароля, так и для полей управления паролем, не требуя никакого дополнительного кода в контроллере.

5 голосов
/ 22 сентября 2010

здесь ошибка

'passwordequal' => array('checkpasswords','message' => 'Passwords dont match') 

Я изменил ее на

'passwordequal'  => array('rule' =>'checkpasswords','message' => 'Passwords dont match')

также функция strcmp также имела ошибки, так как она возвращала бы 0 (т.е. False) все время в приведенном вышекод

if(strcmp($this->data['Airline']['password'],$this->data['Airline']['confirm_password']) ==0 )
{
    return true;
}
return false;
3 голосов
/ 19 июня 2013

Для подтверждения пароля, старого пароля и подтверждения пароля

class Adminpassword extends AppModel
{


    public $name          =  'Admin';
            public $primaryKey    =  'id';
            public $validate = array(
                'oldpassword' => array(
                        array(
                        'rule' => 'notEmpty',
                        'required' => true,
                        'message' => 'Please Enter Current password'
                        ),
                        array(
                        'rule' =>'checkcurrentpasswords',
                        'message' => 'Current Password does not match'
                        )
                ),
                'password' => array(
                        array(
                                'rule' => 'notEmpty',
                                'required' => true,
                                'message' => 'Please Enter password'
                        ),
                        array(                              
                         'rule' => array('minLength', 6),
                         'message' => 'Passwords must be at least 6 characters long.',
                        )
                ),
                'cpassword' => array(
                        array(
                        'rule' => 'notEmpty',
                        'required' => true,
                        'message' => 'Please Enter Confirm password'
                        ),
                        array(
                                'rule' => 'checkpasswords',
                                'required' => true,
                                'message' => 'Password & Confirm Password must be match.'
                        )
                )
            );

   function checkpasswords()     // to check pasword and confirm password
    {  
        if(strcmp($this->data['Adminpassword']['password'],$this->data['Adminpassword']['cpassword']) == 0 ) 
        {
            return true;
        }
        return false;
    }
    function checkcurrentpasswords()   // to check current password 
    {
        $this->id = $this->data['Adminpassword']['id'];
        $user_data = $this->field('password');       
        //print_r(Security::hash($this->data['Adminpassword']['oldpassword'], 'sha1', true));
        if ($user_data == (Security::hash($this->data['Adminpassword']['oldpassword'], 'sha1', true)))
        { 
             return true;
        }
        else
        {
         return false;
        }
    } 

}
2 голосов
/ 13 мая 2013

Для пользователей CakePHP 2.x, использующих Аутентификацию, вы можете заметить, что «AuthComponent больше не автоматически хеширует каждый найденный им пароль».Т.е. приведенные выше решения могут быть неправильным способом решения проблемы для 2.x.http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html#hashing-passwords

1 голос
/ 13 июня 2013

Вот мое решение:

Вы должны создать метод с именем match (вы можете назвать его как хотите):

public function match($check, $with) {
    // Getting the keys of the parent field
    foreach ($check as $k => $v) {
        $$k = $v;
    }

    // Removing blank fields
    $check = trim($$k);
    $with = trim($this->data[$this->name][$with]);

    // If both arent empty we compare and return true or false
    if (!empty($check) && !empty($with)) {
        return $check == $with;
    }

    // Return false, some fields is empty
    return false;
}

И метод $ validate должен быть таким:

public $validate = array(
    'password' => array(
        'match' => array(
            'rule' => array('match', 'password2'),
            'message' => 'Passwords doesnt match',
        ),
    ),
);

Где password2 - поле для сравнения вашего первого password поля

Я рад поделиться этим! : D

0 голосов
/ 29 марта 2012

Поможет ли это: http://sumanrs.wordpress.com/2011/10/01/cakephp-user-password-manager-authentication-missing-guide/?Это должно позаботиться о проверке пароля.

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