【发布时间】:2015-11-28 20:02:02
【问题描述】:
我想要求用户选择一个包含至少一个大写字母和一个数字的强密码。使用 CodeIgniter 验证表单时如何执行此策略?
【问题讨论】:
-
使用回调和一些正则表达式stackoverflow.com/a/65401563/7186739
标签: php codeigniter validation passwords
我想要求用户选择一个包含至少一个大写字母和一个数字的强密码。使用 CodeIgniter 验证表单时如何执行此策略?
【问题讨论】:
标签: php codeigniter validation passwords
扩展默认的Form_validation 类并为您的自定义密码验证创建自定义验证规则。
要扩展默认类,您需要创建一个MY_Form_validation 类并将其放入您的application/libraries/MY_Form_validation.php。这是一个例子:
<?php defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Extension of CI's default form validation library.
*
* @see system/libraries/Form_validation.php
*/
class MY_Form_validation extends CI_Form_validation {
/**
* Custom password validation rule.
*
* @param string $pass Password to check.
*
* @return bool
*/
public function check_pass($pass)
{
// It's a good practice to make sure each validation rule does
// its own job. So we decide that this callback does not check
// for the password field being required. If we need so, we just
// prepend the "required" rule. For example: "required|min_length[8]|check_pass"
//
// So we just let it go if the value is empty:
if (empty($pass))
{
return TRUE;
}
// This sets the error message for your custom validation
// rule. %s will be replaced with the field name if needed.
$this->set_message('check_pass', 'Password needs to have at least one uppercase letter and a number.');
// The regex looks ahead for at least one lowercase letter,
// one uppercase letter and a number. IT'S NOT TESTED THOUGH.
return (bool) preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).+$/', $pass);
}
}
有了这个自定义类,check_pass 验证规则将在设置规则时可供您的控制器使用。
如果您懒得添加这个自定义类,或者您已经在其他地方实现了验证函数,您可能希望通过在现有函数的名称前面加上 callback_ 来使用自定义验证回调并将它们用作验证规则.有关更多信息,请参阅validation callbacks。
我不推荐后一种方法,因为它与验证规则所在的位置相混淆。在某些情况下,我们必须使用不在验证类中的自定义回调,在这些情况之外(不是您的情况),所有规则最好在您的自定义类中。
附:还要考虑这个:
【讨论】:
MY_Form_validation 类时,您不需要额外的 callback_ 前置。只是check_pass。
'password' => array( 'field' => 'password', 'label' => 'Password', 'rules' => 'trim|min_length[6]|matches[password_confirm]|check_pass' ), 'password_confirm' => array( 'field' => 'password_confirm', 'label' => 'Confirm password', 'rules' => 'trim|min_length[6]|matches[password]|check_pass' ),
preg_match 不返回布尔值,它可能会弄乱你的密码,我们需要对它的返回值进行类型转换。 (我更新了代码)第二;要进行测试,请将 check_pass 规则更改为始终返回 FALSE 并查看它是否被调用。如果是这样,那么您应该使用正则表达式。