2013-10-11 98 views
0

因爲從3dgoo這裏巨大的幫助Store Sensitive Data in Silverstripe 我能創造這個數據對象存儲ClientPasswords - >http://www.sspaste.com/paste/show/5257a5ccdf990SilverStripe密碼DE /加密不起作用

的問題是,與getCMSFields創建域之後, de /和加密不再工作,密碼以明文形式存儲在數據庫中:/

有人可以幫我解決它嗎?錯誤在哪裏?

+0

'在哪裏'的錯誤:在哪裏?代碼第一? –

+0

閱讀! ;)在我的問題中有兩個鏈接;) – invictus

回答

1

我不能在那裏發現一個bug,因爲你沒有,如果你不打電話給一個意識形態。

當您使用文本字段時,您實際上並沒有將密碼重寫到哈希版本的任何位置。

這涉及到實際現場的分貝元素:

new TextField('Password', _t('Dict.PASSWORD', 'Password')) 

所以你不要再追寫或讀功能的crypting或解密。

使其工作的一種方法是將文本字段綁定到不是直接與db關係的自定義getter/setter,然後獲取並設置實際的db字段。

該樣品是:

1)添加字段作爲這樣

$fields->addFieldToTab("Root.Main", new TextField('CusotomgetterSetter', "Set the password") 

2)創建的設置器對類:

public function setCusotomgetterSetter($value){ 
    if(!$this->Salt){ 
     $this->Salt = uniqid(mt_rand()); 
    } 
    $test = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($this->Salt), $value, MCRYPT_MODE_CBC, md5(md5($this->Salt)))); 
    $this->Password = $test; 
} 

public function getCusotomgetterSetter(){ 
    return rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($this->Salt), base64_decode($this->Password), MCRYPT_MODE_CBC, md5(md5($this->Salt))), "\0"); 
} 

3)添加新的鹽字段到db,記得運行/ dev/build

static $db = array (
    'Type' => 'Text', 
    'Username' => 'Text', 
    'Password' => 'Text', 
    'URL' => 'Text', 
    'Webadmin' => 'Text', 
    'Editable' => 'Text', 
"Salt" => "Text" 
); 

我修改了get和set字段來使用這裏創建的salt。不是在會員中找到的人,因爲在這一點上我們實際上不會實際上是成員關係,因此$ this-> Member()可能爲空。

「工作」樣品http://www.sspaste.com/paste/show/5257f7743cf0b

+0

我試過這樣。但是結果是一個空字段'\t public function onBeforeWrite(){} this-> Member() - > Salt),base64_decode($ this->密碼),MCRYPT_MODE_CBC,md5(md5($ this-> Member() - > Salt))),「\ 0」); \t \t parent :: onBeforeWrite(); \t}' – invictus

+0

下面是完整的代碼http://www.sspaste.com/paste/show/5257c96b0f929 – invictus

+0

你可以使用onbefore寫,但有一個更簡單的方法,生病發布它作爲答案:) –