2017-09-13 27 views
0

我是Yii的新手,剛開始創建註冊和登錄模塊。 註冊工作正常,但是當我嘗試登錄Yii :: $ app-> user-> isGuest時總是如此,但是在LoginForm :: login()中它正常工作,並且Yii :: $ app-> user包含當前用戶的信息。 LoginForm.php:含有這些設置

<?php 

namespace app\models; 

use Yii; 
use yii\base\Model; 

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

    private $_user = false; 


    /** 
    * @return array the validation rules. 
    */ 
    public function rules() 
    { 
     return [ 
      // login and password are both required 
      [['login', 'pass'], 'required'], 
      // rememberMe must be a boolean value 
      ['rememberMe', 'boolean'], 
      // password is validated by validatePassword() 
      ['pass', '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->pass)) { 
       $this->addError($attribute, 'Wrong login or password.'); 
      } 
     } 
    } 

    /** 
    * Logs in a user using the provided login and password. 
    * @return bool whether the user is logged in successfully 
    */ 
    public function login() 
    { 
     if ($this->validate()) 
     { 
      $user = $this->getUser(); 
      if (!$user->active) 
      { 
       $this->addError('login', 'You account is not active.'); 
       return false; 
      } 
      return Yii::$app->user->login($user, $this->rememberMe ? 3600*24*30 : 0); 
     } 
     return false; 
    } 

    /** 
    * Finds user by [[login]] 
    * 
    * @return User|null 
    */ 
    public function getUser() 
    { 
     if ($this->_user === false) 
     { 
      $this->_user = User::findByLogin($this->login); 
     } 

     return $this->_user; 
    } 
} 

user.php的

<?php 


namespace app\models; 

use Yii; 
use yii\base\NotSupportedException; 
use yii\behaviors\TimestampBehavior; 
use yii\db\ActiveRecord; 
use yii\web\IdentityInterface; 

/** 
* User model 
* 
* @property integer $id 
* @property string $login 
* @property string $pass 
* @property string $password_reset_token 
* @property string $email 
* @property string $auth_key 
* @property integer $status 
* @property integer $created_at 
* @property string $password write-only password 
*/ 
class User extends ActiveRecord implements IdentityInterface 
{ 
    const STATUS_DELETED = 0; 
    const STATUS_ACTIVE = 10; 

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

    /** 
    * @inheritdoc 
    */ 
    /*public function behaviors() 
    { 
     return [ 
      TimestampBehavior::className(), 
     ]; 
    }*/ 

    /** 
    * @inheritdoc 
    */ 
    public function rules() 
    { 
     return [ 
      ['status', 'default', 'value' => self::STATUS_ACTIVE], 
      ['status', 'in', 'range' => [self::STATUS_ACTIVE, self::STATUS_DELETED]], 
     ]; 
    } 

    /** 
    * @inheritdoc 
    */ 
    public static function findIdentity($id) 
    { 
     return static::findOne(['id' => $id, 'status' => self::STATUS_ACTIVE]); 
    } 

    /** 
    * @inheritdoc 
    */ 
    public static function findIdentityByAccessToken($token, $type = null) 
    { 
     throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.'); 
    } 

    /** 
    * Finds user by login 
    * 
    * @param string $login 
    * @return static|null 
    */ 
    public static function findBylogin($login) 
    { 
     return static::findOne(['login' => $login]); 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function getId() 
    { 
     return $this->getPrimaryKey(); 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function getAuthKey() 
    { 
     return $this->auth_key; 
    } 

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

    /** 
    * Validates password 
    * 
    * @param string $password password to validate 
    * @return bool if password provided is valid for current user 
    */ 
    public function validatePassword($password) 
    { 
     return Yii::$app->security->validatePassword($password, $this->pass); 
    } 

    /** 
    * Generates password hash from password and sets it to the model 
    * 
    * @param string $password 
    */ 
    public function setPassword($password) 
    { 
     $this->pass = Yii::$app->security->generatePasswordHash($password); 
    } 

    /** 
    * Generates "remember me" authentication key 
    */ 
    public function generateAuthKey() 
    { 
     $this->auth_key = Yii::$app->security->generateRandomString(); 
    } 



    public static function findByPasswordResetToken($token) 
    { 

     if (!static::isPasswordResetTokenValid($token)) { 
      return null; 
     } 

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

    public static function isPasswordResetTokenValid($token) 
    { 
     if (empty($token)) { 
      return false; 
     } 

     $timestamp = (int) substr($token, strrpos($token, '_') + 1); 
     $expire = Yii::$app->params['user.passwordResetTokenExpire']; 
     return $timestamp + $expire >= time(); 
    } 

    public function generatePasswordResetToken() 
    { 
     $this->password_reset_token = Yii::$app->security->generateRandomString() . '_' . time(); 
    } 

    public function removePasswordResetToken() 
    { 
     $this->password_reset_token = null; 
    } 
} 

web.php:

'user' => [ 
      'identityClass' => 'app\models\User', 
      'enableAutoLogin' => true, 
     ], 

會議是沒有數據了。但服務器會話正常工作。 查看模板有Yii :: $ app-> user-> isGuest始終爲真。 有誰知道什麼是錯的``

main.php:

<?php 

/* @var $this \yii\web\View */ 
/* @var $content string */ 

use yii\helpers\Html; 
use yii\bootstrap\Nav; 
use yii\bootstrap\NavBar; 
use yii\widgets\Breadcrumbs; 
use app\assets\AppAsset; 
use yii\bootstrap\ActiveForm; 
use app\models\LoginForm; 

AppAsset::register($this); 
?> 
<?php $this->beginPage() ?> 
<!DOCTYPE html> 
<html lang="<?= Yii::$app->language ?>"> 
<head> 
    <meta charset="<?= Yii::$app->charset ?>"> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <?= Html::csrfMetaTags() ?> 
    <title><?= Html::encode($this->title) ?></title> 
    <?php $this->head() ?> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
</head> 
<body> 
<?php $this->beginBody() ?> 

<div class="wrap"> 
    <?php 
    NavBar::begin([ 
     'brandLabel' => 'Cupimet', 
     'brandUrl' => Yii::$app->homeUrl, 
     'options' => [ 
      'class' => 'navbar-inverse navbar-fixed-top', 
     ], 
    ]); 
    /*echo Nav::widget([ 
     'options' => ['class' => 'navbar-nav navbar-right'], 
     'items' => [ 
      ['label' => 'Home', 'url' => ['/site/index']], 
      ['label' => 'About', 'url' => ['/site/about']], 
      ['label' => 'Contact', 'url' => ['/site/contact']], 
      Yii::$app->user->isGuest ? (
       ['label' => 'Login', 'url' => ['/site/login']] 
      ) : (
       '<li>' 
       . Html::beginForm(['/site/logout'], 'post') 
       . Html::submitButton(
        'Logout (' . Yii::$app->user->identity->username . ')', 
        ['class' => 'btn btn-link logout'] 
       ) 
       . Html::endForm() 
       . '</li>' 
      ) 
     ], 
    ]);*/ 
?> 
    <div class="navbar-nav navbar-right login-form-head"> 
    <?php 
    if (\Yii::$app->user->isGuest) 
    { 
     $model = new LoginForm; 
     $form = ActiveForm::begin([ 
      'action' => '/site/login', 
      'id' => 'login-form', 
      'layout' => 'inline', 
      'fieldConfig' => [ 
       'template' => "{label}\n<div class=\"col-lg-3\">{input}</div>\n<div class=\"col-lg-8\">{error}</div>", 
       'labelOptions' => ['class' => 'col-lg-1 control-label'], 
      ], 
     ]); 
    ?> 

     <?= $form->field($model, 'login', ['template'=>'{input}<a href="/site/signup" class="regforgetlinx">Регистрация</a>'])->textInput(['placeHolder'=>'Логин']) ?> 


     <?= $form->field($model, 'pass', ['template'=>'{input}<a href="/site/forgotpass" class="regforgetlinx">Забыли пароль?</a>'])->passwordInput(['placeHolder'=>'Пароль']) ?> 


     <div class="form-group"> 
      <div class="col-lg-offset-1 col-lg-11"> 
       <?= Html::submitButton('ВОЙТИ', ['class' => 'btn btn-primary btn-loginhead', 'name' => 'login-button']) ?> 
      </div> 
     </div> 

    <?php 
     ActiveForm::end(); 
    } 
    else 
    { 
    ?> 
     <div>Здравствуйте, <?=Yii::$app->user->login?></div> 
     <div class="form-group"> 
      <div class="col-lg-offset-1 col-lg-11"> 
       <?= Html::submitButton('ВОЙТИ', ['class' => 'btn btn-primary btn-loginhead', 'name' => 'login-button']) ?> 
      </div> 
     </div> 
    <?php 
    } 
    ?> 
    </div> 
    <?php 

    NavBar::end(); 
    ?> 

<div class="container"> 
     <?= Breadcrumbs::widget([ 
      'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [], 
     ]) ?> 
     <?= $content ?> 
    </div> 
</div> 

<footer class="footer"> 
    <div class="container"> 
     <p class="text-center">&copy; cupimet Copyright <?= date('Y') ?></p> 

    </div> 
</footer> 

<?php $this->endBody() ?> 
</body> 
</html> 
<?php $this->endPage() ?> 

SiteController.php

<?php 

namespace app\controllers; 

use Yii; 
use yii\filters\AccessControl; 
use yii\web\Controller; 
use yii\web\Response; 
use yii\filters\VerbFilter; 
use app\models\LoginForm; 
use app\models\ContactForm; 
use app\models\SignupForm; 
use app\models\User; 
use yii\helpers\Html; 
use yii\helpers\Url; 

class SiteController extends Controller 
{ 
    /** 
    * @inheritdoc 
    */ 
    public function behaviors() 
    { 
     return [ 
      'access' => [ 
       'class' => AccessControl::className(), 
       'only' => ['logout'], 
       'rules' => [ 
        [ 
         'actions' => ['logout'], 
         'allow' => true, 
         'roles' => ['@'], 
        ], 
       ], 
      ], 
      'verbs' => [ 
       'class' => VerbFilter::className(), 
       'actions' => [ 
        'logout' => ['post'], 
       ], 
      ], 
     ]; 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function actions() 
    { 
     return [ 
      'error' => [ 
       'class' => 'yii\web\ErrorAction', 
      ], 
      'captcha' => [ 
       'class' => 'yii\captcha\CaptchaAction', 
       'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null, 
      ], 
     ]; 
    } 

    /** 
    * Displays homepage. 
    * 
    * @return string 
    */ 
    public function actionIndex() 
    { 
     return $this->render('index'); 
    } 

    /** 
    * Login action. 
    * 
    * @return Response|string 
    */ 
    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(); 
     } 
     return $this->render('login', [ 
      'model' => $model, 
     ]); 
    } 

    /** 
    * Logout action. 
    * 
    * @return Response 
    */ 
    public function actionLogout() 
    { 
     Yii::$app->user->logout(); 

     return $this->goHome(); 
    } 

    /** 
    * Displays contact page. 
    * 
    * @return Response|string 
    */ 
    /*public function actionContact() 
    { 
     $model = new ContactForm(); 
     if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app->params['adminEmail'])) { 
      Yii::$app->session->setFlash('contactFormSubmitted'); 

      return $this->refresh(); 
     } 
     return $this->render('contact', [ 
      'model' => $model, 
     ]); 
    }*/ 

    /** 
    * Displays about page. 
    * 
    * @return string 
    */ 
    /*{ 
     return $this->render('about'); 
    } 

    public function actionAddAdmin() 
    { 
    $model = User::find()->where(['login' => 'admin'])->one(); 
    if (empty($model)) { 
     $user = new User(); 
     $user->login = 'admin'; 
     $user->email = '[email protected]'; 
     $user->setPassword('7777777'); 
     $user->generateAuthKey(); 
     if ($user->save()) { 
      echo 'good'; 
     } 
     print 777; 
    } 
    }*/ 

    public function actionSignup() 
    { 
     $model = new SignupForm(); 

     if ($model->load(Yii::$app->request->post())) { 
      if ($user = $model->signup()) { 
       if (Yii::$app->getUser()->login($user)) { 
        return $this->goHome(); 
       } 
      } 
     } 

     return $this->render('signup', [ 
      'model' => $model, 
     ]); 
    } 

    /* 
    * Подтверждение подписки. 
    * В качестве GET-параметра принимается код, который сравнивается с тем, что в таблице subscription 
    * в ячейке activation. При успехе - ставится true в ячейку status. 
    */ 
    public function actionActivation(){ 
     $code = Yii::$app->request->get('code'); 
     $code = Html::encode($code); 
     //ищем код подтверждения в БД 
     $find = User::find()->where(['email_confirm_token' => $code])->one(); 
     if($find){ 
      $find->active = 1; 
      if ($find->save()) { 
       $text = '<p>Поздравляем!</p> 
       <p>Ваш e-mail подтвержден и регистрация завершена.</p>'; 
       //страница подтверждения 
       return $this->render('activation', [ 
        'text' => $text 
       ]); 
      } 
     } 

     $absoluteHomeUrl = Url::home(true); 
     return $this->redirect($absoluteHomeUrl, 303); //на главную 
    } 
} 
+0

問題解決。那是因爲用戶表中的狀態字段是0而不是10。 – Peter

+0

@Peter,您應該更新您的問題,並提供有關您如何解決問題的信息......或者發佈自己問題的答案。這樣其他人可能會發現它有幫助 – Imtiaz

回答

0

如果有人感興趣,我創建MySQL用戶表和字段的不同結構「狀態」被設置爲0.因此,我將其更改爲10,問題解決了...