0

我在DataMapper ORM 1.6.0中使用Codeigniter 2.0.3。在CI中集成DataMapper已成功實現,除密碼加密外,一切正常。在DataMapper和Codeigniter中加密密碼自定義規則

我有模型叫users.php與類Users。我還設置驗證規則:

var $validation = array(
    array(
     'field' => 'password', 
     'label' => 'Password', 
     'rules' => array('required', 'trim', 'unique', 'min_length' => 5, 'encrypt'), 
    ), 
    array(
     'field' => 'email', 
     'label' => 'Email Address', 
     'rules' => array('required', 'trim', 'valid_email') 
    ) 
); 

我的加密功能的驗證規則:

function _encrypt($field) 
{ 
    // Don't encrypt an empty string 
    if (!empty($this->{$field})) 
    { 
     // Generate a random salt if empty 
     if (empty($this->salt)) 
     { 
      $this->salt = md5(uniqid(rand(), true)); 
     } 

     $this->{$field} = sha1($this->salt . $this->{$field}); 
    } 
} 

MySQL的users表結構:

id 
email 
password 
last_login 
created_on 

我簡單的通過控制器創建新的用戶:

$u = new Users(); 
$u->email = '[email protected]'; 
$u->password = 'mario'; 
$u->save(); 

EDIT 1:

完整代碼的users.php模型here


用戶成功存儲在數據庫中,但原始密碼未加密。

我在做什麼錯?

感謝,問候 馬里奧

+0

我們可以看到完整的'users.php'模型嗎?你的代碼是正確的,所以我假設無法找到驗證規則。 – swatkins

+0

@swatkins我已經用完整'users.php'模型代碼鏈接更新了我的第一篇文章。 – Puzo

回答

-1

我解決了問題,升級到DataMapper的版本1.8.x的。現在,它工作得很好!

2

我相信這是你的salt類變量缺失。在您的_encrypt函數中,您可以調用$this->salt,但是,您從不在模型中聲明鹽。我認爲你需要在類中添加一個salt變量:

// in your Users model 
<?php if (!defined('BASEPATH')) exit('No direct script access allowed.'); 

class Users extends DataMapper { 

    var $table = 'users'; 
    var $has_one = array('profile'); 
    var $salt = 'B1471tU77IK1411'; // any string - helps to make password encryption stronger 
+0

謝謝你的回覆。我也嘗試過但沒有成功。問題仍然存在。 – Puzo

+0

您是否嘗試過提交一封無效的電子郵件來測試您的驗證是否被調用? – swatkins

+0

是的,我檢查了電子郵件地址驗證,它的工作原理。我解決了將DataMapper升級到1.8.x版的問題。現在,它工作得很好!謝謝.. – Puzo