2015-04-27 73 views
1

我工作的一個項目,重建使用CakePHP,這裏按照新的認證文件等型號: http://book.cakephp.org/3.0/en/controllers/components/authentication.htmlCakePHP的3驗證比對用戶

從什麼我讀,Cake3使用的usermodel ='用戶'默認情況下,但它可以將它設置爲任何你想要的。在我的情況下,我在'帳戶'模型中擁有所有驗證數據(即userModel =>'帳戶')。

所以,在我的帳戶實體,添加以下代碼:

protected function _setPassword($password) 
{ 
    return (new DefaultPasswordHasher)->hash($password); 
} 

此外,在我的賬表,我的「passwd文件」字段設置爲varchar(255)[我讀過的需要的因爲某些原因]。

當我使用默認的烘焙「添加」和「編輯」方法時,密碼以純文本形式存儲,而不是散列。我發現解決這個問題的唯一途徑是建立在AccountsTable類的自定義方法,然後用這個雜牌稱之爲:

$this->request->data['passwd'] = $this->Accounts->hashPassword($this->request->data['passwd']); 

我的驗證組件看起來像這樣...

$this->loadComponent('Auth', [ 
     'loginAction' => [ 
      'controller' => 'Accounts', 
      'action' => 'login' 
     ], 
     'authError' => 'Unauthorized Access', 
     'authenticate' => [ 
      'Form' => [ 
       'fields' => [ 
        'username' => 'username', 
        'password' => 'passwd' 
       ], 
       'userModel'=>'Accounts' 
      ] 
     ] 
    ]); 

有沒有辦法做到這一點,而不是與原始請求數據混在一起?

+0

見跟進AccountsTable-> hashPassword是完全一樣的賬戶 - > _ setPassword()函數。 – user4838338

+0

謝謝@ user4838338。從你的問題得到了我的答案 – Pradeepta

回答

2

你的mutator被錯誤地命名,mutators的約定是_set,後面跟着駝峯字段/屬性名稱。因此,由於您的字段名稱爲passwd,而不是password,因此必須將其命名爲_setPasswd

protected function _setPasswd($password) 
{ 
    return (new DefaultPasswordHasher)->hash($password); 
} 

Cookbook > Entities > Accessors & Mutators

+0

謝謝!我知道我錯過了那裏顯而易見的東西。 – user4838338

+0

我在這裏有同樣的問題,但它說:「SQLSTATE [42S22]:未找到列:1054'where子句'中的未知列'Users.username'」 – Daroath

+0

@Daroath這是一個問題嗎?在任何情況下,這都不是OP所具有的問題。 – ndm