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