Применение надежных паролей в Kohana Auth

Я пытаюсь применить надежные пароли в своем приложении Kohana с помощью Auth, используя следующее регулярное выражение, чтобы потребовать по крайней мере одну букву в верхнем регистре, одну строчную букву, одно число, один небуквенный (специальный символ) и минимум из 8 символов.

^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[^A-Za-z0-9]).{8,}$

Регулярное выражение работает, как видно на Rubular. Вот код, который я использую в Kohana Model_Auth_User, который расширяет ORM.

public function rules() {
    return array(
        'password' => array(
            array('not_empty'),
            array('min_length', array(':value', 8)),
            array('regex', array(':value', '/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[^A-Za-z0-9]).{8,}$/'))
        )
    );
}

Однако при создании новой учетной записи пользователя или изменении пароля существующей это регулярное выражение полностью игнорируется. Однако min_length из строки выше работает нормально!

Это не позволит мне использовать test в качестве пароля, потому что он содержит менее 8 символов, но testing123 не выдает никаких сообщений об ошибках.

Любые идеи, почему это происходит и как это обойти?


person SigmaSteve    schedule 11.03.2017    source источник
comment
Вы храните пароль в виде хэша? Насколько я помню, правила ORM применяются к значениям базы данных, а не к значениям REQUEST.   -  person bato3    schedule 14.03.2017
comment
@ bato3 Да, пароль хеширован. Однако проверка пароля выполняется для значений POST перед шифрованием.   -  person SigmaSteve    schedule 14.03.2017
comment
Я знаю это. Я пытаюсь объяснить, почему код up не работает. save без дополнительной проверки использовать внутренние значения, и это было хешировано методом set. Таким образом, вы должны использовать необработанные необработанные (POST) значения с дополнительной проверкой. kohanaframework.org/3.3/guide-api/Model_Auth_User#filters, #set, #create   -  person bato3    schedule 14.03.2017
comment
Я обновил свой вопрос и ответ, чтобы сделать его более понятным. Спасибо за уделенное время.   -  person SigmaSteve    schedule 16.03.2017


Ответы (1)


Разобрался - вам нужно добавить регулярное выражение в функцию get_password_validation (в той же модели), иначе оно не выводит никаких сообщений об ошибках.

public static function get_password_validation($values) {
    return Validation::factory($values)
        ->rule('password', 'min_length', array(':value', 8))
        ->rule('password', 'regex', array(':value', '/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[^A-Za-z0-9]).{8,}$/'))
        ->rule('password_confirm', 'matches', array(':validation', ':field', 'password'));
}

Если добавлено, регулярное выражение в функции rules() необходимо удалить, иначе вход в систему будет невозможен, так как он выполняет проверку регулярного выражения для хешированной строки, которая не содержит специальных символов.

Надеюсь, это поможет кому-то.

person SigmaSteve    schedule 11.03.2017