Home  >  Article  >  Backend Development  >  Yii2 basic version login uses Yii::$app->user->login($user); an error occurs

Yii2 basic version login uses Yii::$app->user->login($user); an error occurs

WBOY
WBOYOriginal
2016-08-04 09:21:292712browse

Yii2 basic版登录使用Yii::$app->user->login($user);出现错误Array to string conversion

  1. MyAuthenticationController.php

<code><?php

namespace app\controllers;

use Yii;
use yii\web\Controller;
use app\models\User;

class MyAuthenticationController extends Controller
{
    public function actionIndex()
    {
        echo 'login success'; exit;
    }
    public function actionLogin()
    {
        $error = null;
        $username = Yii::$app->request->post('username',null);
        $password = Yii::$app->request->post('password',null);

        $user = User::findOne(['username'=>$username]);

        if(($username!=null)&&($password!=null))
        {
            if($user!=null){
                if($user->validatePassword($password)){
                    $this->redirect(['index']);//这里可以实现重定向
//                    Yii::$app->user->login($user);这是源代码,但是会出现“Array to string conversion”的错误,暂时还没有解决,所以使用上面的重定向代码来转向指定登录成功的页面
                }else{
                    $error = 'Password validation failed';
                }
            }else{
                $error = 'User not found';
            }
        }
        return $this->render('login',['error'=>$error]);
    }

    public function actionLogout()
    {
        Yii::$app->user->logout();
        return $this->redirect(['login']);
    }
}</code>
  1. app\models\User.php

<code><?php

namespace app\models;

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


class User extends ActiveRecord implements IdentityInterface
{
    public static function tableName()
    {
        return 'user';
    }


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

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

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

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

    /**
     * @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 boolean if password provided is valid for current user
     */
    public function validatePassword($password)
    {
        return Yii::$app->security->validatePassword($password,$this->password_hash);
    }

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

    public function beforeSave($insert)
    {
        if(parent::beforeSave($insert)){
            if($this->isNewRecord){
                $this->auth_key = \Yii::$app->security->generateRandomString();
            }
            return true;
        }
        return false;
    }
}</code>
  1. views\my-authentication\login.php

<code><?php
use \yii\bootstrap\ActiveForm;
use \yii\helpers\Html;
use \yii\bootstrap\Alert;
?>

<?php
if($error!=null){
    echo Alert::widget(['options'=>['class'=>'alert-danger'],'body'=>$error]);
};
?>

<?php if(Yii::$app->user->isGuest) { ?>
    <?php ActiveForm::begin() ?>

    <div class="form-group">
        <?php echo Html::label('Username','username'); ?>
        <?php echo Html::textInput('username','',['class'=>'form-control']);?>
    </div>

    <div class="form-group">
        <?php echo Html::label('Password','password'); ?>
        <?php echo Html::passwordInput('password','',['class'=>'form-control']); ?>
    </div>

    <?php echo Html::submitButton('Login',['class'=>'btn btn-primary']); ?>

    <?php ActiveForm::end(); ?>

<?php }  else {?>
    <h2>You are authentication!</h2>
    <br/><br/>
    <?php echo Html::a('logout',['my-authentication/logout'],['class'=>'btn btn-warning']); ?>
<?php } ?></code>
  1. SQL

<code>--
-- 表的结构 `user`
--

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `auth_key` varchar(32) NOT NULL,
  `password_hash` varchar(255) NOT NULL,
  `access_token` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

--
-- 转存表中的数据 `user`
--

INSERT INTO `user` (`id`, `username`, `auth_key`, `password_hash`, `access_token`) VALUES
(1, 'foo', '', '$2a$12$hL0rmIMjxhLqI.xr7jD1FugNWEgZNh62HuJj5.y34XBUfBWB4cppW', NULL);</code>

用户名是foo,密码是foopassword,登录后在Yii::$app->user->login($user);时出现错误,
Yii2 basic version login uses Yii::$app->user->login($user); an error occurs

回复内容:

Yii2 basic版登录使用Yii::$app->user->login($user);出现错误Array to string conversion

  1. MyAuthenticationController.php

<code><?php

namespace app\controllers;

use Yii;
use yii\web\Controller;
use app\models\User;

class MyAuthenticationController extends Controller
{
    public function actionIndex()
    {
        echo 'login success'; exit;
    }
    public function actionLogin()
    {
        $error = null;
        $username = Yii::$app->request->post('username',null);
        $password = Yii::$app->request->post('password',null);

        $user = User::findOne(['username'=>$username]);

        if(($username!=null)&&($password!=null))
        {
            if($user!=null){
                if($user->validatePassword($password)){
                    $this->redirect(['index']);//这里可以实现重定向
//                    Yii::$app->user->login($user);这是源代码,但是会出现“Array to string conversion”的错误,暂时还没有解决,所以使用上面的重定向代码来转向指定登录成功的页面
                }else{
                    $error = 'Password validation failed';
                }
            }else{
                $error = 'User not found';
            }
        }
        return $this->render('login',['error'=>$error]);
    }

    public function actionLogout()
    {
        Yii::$app->user->logout();
        return $this->redirect(['login']);
    }
}</code>
  1. app\models\User.php

<code><?php

namespace app\models;

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


class User extends ActiveRecord implements IdentityInterface
{
    public static function tableName()
    {
        return 'user';
    }


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

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

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

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

    /**
     * @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 boolean if password provided is valid for current user
     */
    public function validatePassword($password)
    {
        return Yii::$app->security->validatePassword($password,$this->password_hash);
    }

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

    public function beforeSave($insert)
    {
        if(parent::beforeSave($insert)){
            if($this->isNewRecord){
                $this->auth_key = \Yii::$app->security->generateRandomString();
            }
            return true;
        }
        return false;
    }
}</code>
  1. views\my-authentication\login.php

<code><?php
use \yii\bootstrap\ActiveForm;
use \yii\helpers\Html;
use \yii\bootstrap\Alert;
?>

<?php
if($error!=null){
    echo Alert::widget(['options'=>['class'=>'alert-danger'],'body'=>$error]);
};
?>

<?php if(Yii::$app->user->isGuest) { ?>
    <?php ActiveForm::begin() ?>

    <div class="form-group">
        <?php echo Html::label('Username','username'); ?>
        <?php echo Html::textInput('username','',['class'=>'form-control']);?>
    </div>

    <div class="form-group">
        <?php echo Html::label('Password','password'); ?>
        <?php echo Html::passwordInput('password','',['class'=>'form-control']); ?>
    </div>

    <?php echo Html::submitButton('Login',['class'=>'btn btn-primary']); ?>

    <?php ActiveForm::end(); ?>

<?php }  else {?>
    <h2>You are authentication!</h2>
    <br/><br/>
    <?php echo Html::a('logout',['my-authentication/logout'],['class'=>'btn btn-warning']); ?>
<?php } ?></code>
  1. SQL

<code>--
-- 表的结构 `user`
--

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `auth_key` varchar(32) NOT NULL,
  `password_hash` varchar(255) NOT NULL,
  `access_token` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

--
-- 转存表中的数据 `user`
--

INSERT INTO `user` (`id`, `username`, `auth_key`, `password_hash`, `access_token`) VALUES
(1, 'foo', '', '$2a$12$hL0rmIMjxhLqI.xr7jD1FugNWEgZNh62HuJj5.y34XBUfBWB4cppW', NULL);</code>

用户名是foo,密码是foopassword,登录后在Yii::$app->user->login($user);时出现错误,
Yii2 basic version login uses Yii::$app->user->login($user); an error occurs

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

不是 PrimaryKey

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn