【问题标题】:codeigniter + require letters and numbers in passwordcodeigniter + 要求密码中包含字母和数字
【发布时间】:2012-05-18 13:12:02
【问题描述】:

我想使用表单验证来要求密码同时包含字母和数字字符。到目前为止,这是我想出的:

$this->form_validation->set_rules('password', 'Password', 'required|matches[passconf]|min_length[8]|alpha_numeric');

问题是“alpha_numeric”要求密码只包含字母或数字,它不需要两者。在这里寻找更强的密码选项。

【问题讨论】:

标签: validation codeigniter passwords codeigniter-2


【解决方案1】:

您可以在控制器中设置callback

public function password_check($str)
{
   if (preg_match('#[0-9]#', $str) && preg_match('#[a-zA-Z]#', $str)) {
     return TRUE;
   }
   return FALSE;
}

然后,更新您的规则以使用它:

$this->form_validation->set_rules('password', 'Password', 'required|matches[passconf]|min_length[8]|alpha_numeric|callback_password_check');

【讨论】:

    【解决方案2】:

    可以在其他项目中轻松重用并本地化验证规则的替代解决方案是扩展 Form_validation 类。

    在 application/libraries/ 中创建一个名为 MY_Form_validation.php 的文件,其中“MY”是您在 application/config/config.php 中设置的子类前缀。

    这个类看起来像:

    class MY_Form_validation extends CI_Form_validation
    {
        /**
         * Verify that a string contains a specified number of
         * uppercase, lowercase, and numbers.
         *
         * @access public
         *
         * @param String $str
         * @param String $format
         *
         * @return int
         */
        public function password_check($str, $format)
        {
            $ret = TRUE;
    
            list($uppercase, $lowercase, $number) = explode(',', $format);
    
            $str_uc = $this->count_uppercase($str);
            $str_lc = $this->count_lowercase($str);
            $str_num = $this->count_numbers($str);
    
            if ($str_uc < $uppercase) // lacking uppercase characters
            {
                $ret = FALSE;
                $this->set_message('password_check', 'Password must contain at least ' . $uppercase . ' uppercase characters.');
            }
            elseif ($str_lc < $lowercase) // lacking lowercase characters
            {
                $ret = FALSE;
                $this->set_message('password_check', 'Password must contain at least ' . $lowercase . ' lowercase characters.');
            }
            elseif ($str_num < $number) //  lacking numbers
            {
                $ret = FALSE;
                $this->set_message('password_check', 'Password must contain at least ' . $number . ' numbers characters.');
            }
    
            return $ret;
        }
    
        /**
         * count the number of times an expression appears in a string
         *
         * @access private
         *
         * @param String $str
         * @param String $exp
         *
         * @return int
         */
        private function count_occurrences($str, $exp)
        {
            $match = array();
            preg_match_all($exp, $str, $match);
    
            return count($match[0]);
        }
    
        /**
         * count the number of lowercase characters in a string
         *
         * @access private
         *
         * @param String $str
         *
         * @return int
         */
        private function count_lowercase($str)
        {
            return $this->count_occurrences($str, '/[a-z]/');
        }
    
        /**
         * count the number of uppercase characters in a string
         *
         * @access private
         *
         * @param String $str
         *
         * @return int
         */
        private function count_uppercase($str)
        {
            return $this->count_occurrences($str, '/[A-Z]/');
        }
    
        /**
         * count the number of numbers characters in a string
         *
         * @access private
         *
         * @param String $str
         *
         * @return int
         */
        private function count_numbers($str)
        {
            return $this->count_occurrences($str, '/[0-9]/');
        }
    }
    

    然后设置规则:

    $this->form_validation->set_rules('password', 'Password', 'required|matches[passconf]|min_length[8]|alpha_numeric|password_check[1,1,1]');
    

    该规则可以以多种不同的方式使用。 'password_check[1,1,1]' 要求密码包含小写、大写和数字字符。 'password_check[5,0,1]' 需要 5 个大写字符和一个数字。

    这样做的好处是:

    1. 您的所有规则都包含在一个易于移植的类中
    2. 诸如“count_occurences”之类的子验证函数可以轻松地用于其他验证函数。
    3. 可以修改该类以使用 application/language/ 中的语言文件

    【讨论】:

    • 感谢这个非常彻底的回答;我赞成它(因为我已经接受了另一个答案)。希望它能帮助未来的谷歌员工。
    • 我只是喜欢这个功能:无论如何我认为你必须改变 list($username, $lowercase, $number) = explode(',', $format); to list($uppercase, $lowercase, $number) = explode(',', $format);
    • 这个答案真的很有帮助,我会把它添加到我的博客中。
    • 您好先生,请问如何允许特殊字符?
    • @Angel 您需要添加一个计算特殊字符的函数,以更新password_check 方法,以便它使用该新函数检查字符串是否有足够的特殊字符,并修改规则。如果您遇到问题,请打开一个新问题。
    【解决方案3】:

    使用 CI 2.2.0,您可以添加一些参数,例如“alpha_numeric”参数,注意管道(级联)参数:

    function check_password(){
     $this -> form_validation -> set_rules('password', 'New Password', 'required|max_length[15]|min_length[6]|alpha_numeric');
     $this -> form_validation -> set_rules('passconf', 'Re-enter', 'required|matches[password]');
    
     if ($this -> form_validation -> run() == FALSE){
      doStuff();
     } else {
      doOtherStuff();
     }
    }
    

    this 页面底部附近查找规则参考。

    【讨论】:

    • 是的,我读过它,但我的大脑解析错了——我的错……抱歉。
    猜你喜欢
    • 2020-02-23
    • 1970-01-01
    • 2015-10-17
    • 2012-12-22
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 2012-01-14
    相关资源
    最近更新 更多