Home > Backend Development > PHP Tutorial > 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
Release: 2016-08-04 09:21:29
Original
2752 people have browsed it

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>
Copy after login
Copy after login
  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>
Copy after login
Copy after login
  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>
Copy after login
Copy after login
  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>
Copy after login
Copy after login

用户名是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>
Copy after login
Copy after login
  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>
Copy after login
Copy after login
  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>
Copy after login
Copy after login
  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>
Copy after login
Copy after login

用户名是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>
Copy after login

不是 PrimaryKey

Related labels:
source:php.cn
Statement of this Website
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
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template