2013-11-25 18 views
0

正如標題所說,我需要驗證密碼字段,但它可以包含特定數量的大寫字母,特殊字符和數字。所以我創建了這樣的功能CakePHP自定義驗證 - 檢查特定數量的大寫字母,符號和數字

function password_verification($password){ 
$errors[]; 
$min_password_length = ConfigOptions::getValue('password_minimum_length');// minimum password length 
$special_characters = ConfigOptions::getValue('password_minimum_symbols');// Minimum symbols 
$numbers = ConfigOptions::getValue('password_minimum_numbers');// minimum numbers 
$length = strlen($password);// length of inserted password 
preg_match_all("/[A-Z]/", $password, $caps_match); 
$caps_count = count($caps_match [0]);// number of uppercase letters in password 
preg_match_all("/[a-z]/", $password, $small_match); 
$small_count = count($small_match [0]);// number of lowercase letters in password 
preg_match_all("/[0-9]/", $password, $num_match); 
$num_count = count($num_match [0]);// number of digits in password 
preg_match_all("/[^a-zA-Z0-9]/", $password, $symb_match); 
$symb_count = count($symb_match [0]); 
if($min_password_length > $length) { 
    $errors['password_length'] = __('Password cannot be shorter than '.$min_password_length.' characters'); 
}// if 
if($uppercase > $caps_count) { 
    $errors['password_uppercase'] = __('Password cannot have less than '.$uppercase.' uppercase letters'); 
}// if 
if($special_characters > $symb_count) { 
    $errors[] = __('Password cannot have less than '.$symb_count.' special characters'); 
}// if 
if($numbers > $num_count) { 
    $errors[] = __('Paswword cannot have less than '.$num_count.' numbers'); 
}// if 
return $errors[]; 
} 

我把它放在控制器中。但是我想知道是否有任何方法可以將其用於模型驗證。

+0

事實上,看一看:http://book.cakephp.org/2.0/en/models/data-validation.html#定製驗證規則 – iso27002

+0

我真的無法回答我是否看過蛋糕簿...... – JohnDoe

回答

2

爲您的每個條件創建驗證規則。這裏是你需要把你的模型有什麼總體思路:

public $validate = array(
    'password' => array(
      'id_rule_1' => array(
       'rule' => 'isPasswordGreaterThanMinLenght' 
      ), 
      'id_rule_2' => array(
       'rule' => 'isCapsCountLimitReached' 
      ), 
     )); 


public function isPasswordGreaterThanMinLenght($check){ 
    $min_password_length = ConfigOptions::getValue('password_minimum_length');// minimum password length 
    $length = strlen($this->data['password']);// length of inserted password 
    $this->validator()->getField('password')->getRule('id_rule_1')->message = 'Password cannot be shorter than '.$min_password_length.' characters'; 
    return ($min_password_length > $length); 
} 

public function isCapsCountLimitReached($check){ 
    $uppercase = '';//define uppercase here 
    $password = $this->data['password']; 
    preg_match_all("/[A-Z]/", $password, $caps_match); 
    $caps_count = count($caps_match [0]);// number of uppercase letters in password 
    $this->validator()->getField('password')->getRule('id_rule_2')->message = 'Password cannot have less than '.$uppercase.' uppercase letters'; 
    return ($uppercase > $caps_count); 
} 
+1

這並沒有提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 –

+0

我知道如何做到這一點,但我也需要檢查是否有最小數量的數字和符號。 – JohnDoe

相關問題