2015-04-01 55 views
2

我希望Yii中的用戶身份驗證基於我數據庫中的用戶表。這是我的用戶模型:Yii2從數據庫登錄(設置未知屬性:app models User :: password_hash)

<?php 

namespace app\models; 

use Yii; 
use yii\base\NotSupportedException; 
use yii\db\ActiveRecord; 
use yii\helpers\Security; 
use yii\web\IdentityInterface; 


/** 
* This is the model class for table "user". 
* 
* @property integer $id 
* @property string $username 
* @property string $password 
* @property string $title 
*/ 
class User extends \yii\db\ActiveRecord implements IdentityInterface 
{ 


    public static function tableName() 
    { 
     return 'user'; 
    } 



    /** 
    * @inheritdoc 
    */ 

    public function rules() 
    { 
     return [ 
      [['username', 'password'], 'required'], 

      [['username', 'password'], 'string', 'max' => 100]   

     ]; 
    } 



    /** 
    * @inheritdoc 
*/ 

    public function attributeLabels() 
    { 
     return [ 
      'id' => 'UserID', 
      'username' => 'Username', 
      'password' => 'Password', 

     ]; 

    } 

    public static function findIdentity($id) { 

     return static::findOne($id); 
    } 

    public static function findIdentityByAccessToken($token, $type = null) { 
     return static::findOne(['access_token' => $token]); 
    } 

    public static function findByUsername ($username){ 

     return static::findOne(['username' => $username]); 

    } 
    public static function findbyPasswordResetToken($token) 
    { 
     $expire= \Yii::$app->params['user.passwordResetTokenExpire']; 
     $parts = explode('_', $token); 
     $timestamp = (int) end($parts); 
     if ($timestamp + $expire < time()) { 
      //token expired 
      return null; 

     } 
     return static::findOne(['password_reset_token' => $token ]); 


    } 

    public function getId() { 
     return $this->getPrimaryKey(); 
    } 

    public function getAuthKey() { 
     return $this->auth_key; 
    } 

    public function validateAuthKey($authKey) { 
     return $this->getAuthKey() === $authKey; 
    } 

    public function validatePassword($password){ 
     $this->password_hash= Yii::$app->security->generatePasswordHash ($password); 
    } 
    public function generateAuthKey() 
    { 
     $this->auth_key = Yii::$app->security->generateRandomKey(); 
    } 

    /** 
    * Generates new password reset token 
    */ 
    public function generatePasswordResetToken() 
    { 
     $this->password_reset_token = Yii::$app->security->generateRandomKey() . '_' . time(); 
    } 

    /** 
    * Removes password reset token 
    */ 
    public function removePasswordResetToken() 
    { 
     $this->password_reset_token = null; 
    } 



} 

但它給我這個錯誤,當我嘗試登錄:

設置未知屬性:應用程序\型號\用戶:: password_hash

這是actionLogin在siteController:

public function actionLogin() 
    { 
     if (!\Yii::$app->user->isGuest) { 
      return $this->goHome(); 
     } 

     $model = new LoginForm(); 
     if ($model->load(Yii::$app->request->post()) && $model->login()) { 
      return $this->goBack(); 
     } else { 
      return $this->render('login', [ 
       'model' => $model, 
      ]); 
     } 
    } 

這是LoginForm.php代碼:

public function validatePassword($attribute, $params) 
    { 
     if (!$this->hasErrors()) { 
      $user = $this->getUser(); 

      if (!$user || !$user->validatePassword($this->password)) { 
       $this->addError($attribute, 'Incorrect username or password.'); 
      } 
     } 
} 

/** 
* Logs in a user using the provided username and password. 
* @return boolean whether the user is logged in successfully 
*/ 
public function login() 
{ 
    if ($this->validate()) { 
     return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600*24*30 : 0); 
    } else { 
     return false; 
    } 
} 

我不知道什麼是錯的,你能幫我解決這個問題嗎?

+0

何時發生錯誤?控制器是怎樣的?如果可能,請提供更多信息並設置代碼的格式。 – robsch 2015-04-01 11:34:50

+0

我更新了我的問題,請檢查它。 – user3640056 2015-04-01 11:51:44

+0

我更新了你的問題,請檢查一下。 – robsch 2015-04-01 13:12:35

回答

5

這是因爲在函數「validatePassword()」中分配的列「password_hash」在數據庫中不存在或未在用戶模型中聲明。

如果密碼散列被存儲在「密碼」域中的數據庫,然後改變「validatePassword()」到,

public function validatePassword($password) 
{ 
    return $this->password === Yii::$app->security->generatePasswordHash ($password); 
} 
0

下面是解 1:聲明它在用戶控制器

 * @property string $password_hash 
     class User extends ActiveRecord implements IdentityInterface 
     { 
     public $password; 

     /** 
     * @inheritdoc 
     */ 
     public static function tableName() 
     { 
      return '{{%user}}'; 
     } 

    public function rules() 
    { 
     return [ 
     [['username','email','first_name','last_name','address','password','contact_no','role'], 'safe'], 

       [['email'], 'unique'], 
       [['email'], 'email'], 

     ]; 
    } 
     . 
    . 
    .... 

     public function validatePassword($password) 
     { 
      return Yii::$app->security->validatePassword($password, $this->password_hash); 
     } 

2:在你的LoginForm的模型規則功能添加此

['password', 'validatePassword'], 

一切看起來不錯。希望這可以幫助你

相關問題