رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
مشکل Hash is invalid
#1
با سلام

من طبق آموزش هایی که تو قسمت آموزش جامع yii بود رفتم جلو همه چیز درست هست فرم register بدرستی کار میکنه و پسوردها هم به صورت هش شده در دیتابیس ذخیره میشن ولی هنگام لاگین کردن پیغام زیر رو میگیرم عکس رو ضمیمه کردم

مدل Users و LoginForm رو هم کدهاشو براتون در زیر می نویسم ممکن هست راهنمایی بفرمایید مشکل از چیه؟

متشکر

Users.php
<?php

namespace appmodels;

use Yii;
use yiiwebIdentityInterface;

/**
* This is the model class for table "users".
*
* @property integer $id
* @property string $fullname
* @property string $address
* @property string $email
* @property string $mobile
* @property string $postcode
* @property string $user
* @property string $pass
* @property integer $confirmed
*
* @property Orders[] $orders
*/
class Users extends yiidbActiveRecord implements yiiwebIdentityInterface
{

   public $pass_repeat;
   public $p;
   private $_oldpass;
   public $authKey;
   public $password;
   /**
    * @inheritdoc
    */
   public static function tableName()
   {
       return 'users';
   }

   /**
    * @inheritdoc
    */
   public function rules()
   {
       return [
           [['fullname', 'address', 'email', 'mobile', 'postcode', 'user', 'pass', 'confirmed'], 'required'],
           [['address'], 'string'],
           [['email'], 'email'],
           ['pass_repeat', 'required'  , 'on' =>'register'],
           [['mobile'], 'match' ,'pattern' => '#^0?9[0-3][0-9]{8}$#'],
           [['confirmed'], 'integer'],
           [['fullname', 'email', 'user', 'pass'], 'string', 'max' => 255],
           [[ 'postcode'], 'string', 'max' => 10],
           ['pass_repeat' , 'compare' , 'compareAttribute' => 'pass' , 'message' => 'Password and Confirm Password Must be Match!' ,'on' =>'register'],
       ];
   }

   /**
    * @inheritdoc
    */
   public function attributeLabels()
   {
       return [
            'id' => 'ID',
            'fullname' => 'Fullname',
            'address' => 'Address',
            'email' => 'Email',
            'mobile' => 'Mobile',
            'postcode' => 'Postcode',
            'user' => 'Username',
            'pass' => 'Password',
            'confirmed' => 'Confirmed',
            'pass_repeat' => 'Password Repeat',
        ];
   }

   /**
    * @return yiidbActiveQuery
    */

   public static function findIdentityByAccessToken($token, $type = null)
   {
      return null; // TODO: Implement findIdentityByAccessToken() method.
   }


   public static function findIdentity($id)
   {
       $model=self::findOne($id);
       return $model ? new static($model) : null;
   }


   public function getId()
   {
      return $this->id ; // TODO: Implement getId() method.
   }


   public function getAuthKey()
   {
      return $this->authKey; // TODO: Implement getAuthKey() method.
   }


   public function validateAuthKey($authKey)
   {
      return $this->authKey == $authKey; // TODO: Implement validateAuthKey() method.
   }


   public function getOrders()
   {
       return $this->hasMany(Orders::className(), ['user_id' => 'id']);
   }


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

   }

   }

   public function afterFind()
   {
      $this->pass = $this->_oldpass;

       return parent::afterFind();
   }


   public function beforeSave($insert)
   {
       if (trim($this->pass !== '') || $this->pass != $this->_oldpass){
           $this->pass = Yii::$app->security->generatePasswordHash($this->pass);
   }
       return parent::beforeSave($insert);
   }
}

LoginForm.php

<?php

namespace appmodels;

use Yii;
use yiibaseModel;
use appmodelsUsers;

/**
* LoginForm is the model behind the login form.
*
* @property User|null $user This property is read-only.
*
*/
class LoginForm extends Model
{
   public $username;
   public $password;
   public $rememberMe = true;

   private $_user = false;


   /**
    * @return array the validation rules.
    */
   public function rules()
   {
       return [
           // username and password are both required
           [['username', 'password'], 'required'],
           // rememberMe must be a boolean value
           ['rememberMe', 'boolean'],
           // password is validated by validatePassword()
           ['password', 'validatePassword'],
       ];
   }

   /**
    * Validates the password.
    * This method serves as the inline validation for password.
    *
    * @param string $attribute the attribute currently being validated
    * @param array $params the additional name-value pairs given in the rule
    */
   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 bool 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);
       }
       return false;
   }

   /**
    * Finds user by [[username]]
    *
    * @return User|null
    */
   public function getUser()
   {
       if ($this->_user === false) {
           $this->_user = Users::findOne([ 'LOWER(user)' => strtolower($this->username) , 'confirmed' => 1]);
       }

       return $this->_user;
   }
}


فایل‌های پیوست تصاویر بندانگشتی
   
پاسخ
تشکر شده توسط:
#2
سلام
ببینید چیزی که معلوم است این هست که پسورد هش ایی که شما به تابع validatePassword از کلاس Security فرستاده اید؛ اشتباه است.
هر چی هست زیر سر تابع validatePassword در کلاس Users است. شما در اول خط این تابع کد زیر را قرار دهید تا بررسی کنیم که هشی که ما به تابع validatePassword از کلاس Security فریم ورک می دهیم درسته یا نه !
yii::trace($this->pass);
حالا در debugger ببینید خروجی چی هست.
اگر همونی بود که دقیقا در دیتابیس وجود دارد مشکل از ذخیره هش در دیتابیس است.
در این صورت باید یکبار خروجی را بصورت مستقیم از تابع validatePassword از کلاس Security را مشاهده کنیم تا ببینیم با اونیی که داخل دیتابیس ذخیره می شود یکسان است یا خیر.
پاسخ
تشکر شده توسط:




کاربران در حال بازدید این موضوع: 1 مهمان