【问题标题】:CodeIgniter strong password policy with compulsory uppercase/lowercase letters and digitsCodeIgniter 强密码策略,强制大写/小写字母和数字
【发布时间】:2015-11-28 20:02:02
【问题描述】:

我想要求用户选择一个包含至少一个大写字母和一个数字的强密码。使用 CodeIgniter 验证表单时如何执行此策略?

【问题讨论】:

标签: php codeigniter validation passwords


【解决方案1】:

扩展默认的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

我不推荐后一种方法,因为它与验证规则所在的位置相混淆。在某些情况下,我们必须使用不在验证类中的自定义回调,在这些情况之外(不是您的情况),所有规则最好在您的自定义类中。

附:还要考虑这个:

【讨论】:

  • 严重性:警告消息:preg_match():编译失败:偏移量 31 处的括号不匹配 文件名:libraries/MY_Form_validation.php 行号:130 当我点击时收到此错误注册按钮,当我在设置了验证规则的模型中使用 callback_check_pass 时,注册仍然成功
  • 我在几分钟前更新了正则表达式。现在可以了。去掉末尾多余的括号即可。
  • 当您将规则放入您的自定义 MY_Form_validation 类时,您不需要额外的 callback_ 前置。只是check_pass
  • 它仍然使用简单的小写文本成功登录,消息应包含 1 个大写字母且未显示 1 个数字以下是我在模型中使用的代码:'password' =&gt; array( 'field' =&gt; 'password', 'label' =&gt; 'Password', 'rules' =&gt; 'trim|min_length[6]|matches[password_confirm]|check_pass' ), 'password_confirm' =&gt; array( 'field' =&gt; 'password_confirm', 'label' =&gt; 'Confirm password', 'rules' =&gt; 'trim|min_length[6]|matches[password]|check_pass' ),
  • 第一;我有一个错字,preg_match 不返回布尔值,它可能会弄乱你的密码,我们需要对它的返回值进行类型转换。 (我更新了代码)第二;要进行测试,请将 check_pass 规则更改为始终返回 FALSE 并查看它是否被调用。如果是这样,那么您应该使用正则表达式。
猜你喜欢
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
相关资源
最近更新 更多