2015-05-02 17:40:01 5601次浏览 1条回答 2 悬赏 0 金钱

首先很抱歉,对不起,我实在没有钱作悬赏,但是还是希望大神们能够帮帮我,谢谢

最近学yii2遇到一点困惑,yii2里有一个IdentityInterface接口,实现了该接口的user类可以通过$app->user获取到用户登录状态,我看basic模板的源码在验证用户登录成功后有一个gohome和goback方法重定向了一下,我不太看得懂这里的额源码,所以直接redirect了,发现重定向后无法获取$app->user登陆状态了,此时为空,请问如何在重定向后能获取到该user属性该如何实现呢?
以下附上我的实现代码截图,希望有人能帮帮我

下面是一个users model,继承了IdentityInterface接口, 里面有login验证方法

class Users extends \yii\db\ActiveRecord implements IdentityInterface
{

    public $rememberMe = false;
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'users';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['username', 'email', 'password', 'create_at', 'status'], 'required'],
            [['create_at'], 'safe'],
            [['status'], 'integer'],
            [['username'], 'string', 'max' => 20],
            [['email'], 'string', 'max' => 40],
            [['password'], 'string', 'max' => 64],
            [['auto_key', 'access_token'], 'string', 'max' => 30],
            [['username', 'email'], 'unique', 'targetAttribute' => ['username', 'email'], 'message' => 'The combination of Username and Email has already been taken.']
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'username' => 'Username',
            'email' => 'Email',
            'password' => 'Password',
            'create_at' => 'Create At',
            'status' => 'Status',
            'auto_key' => 'Auto Key',
            'access_token' => 'Access Token',
        ];
    }




    public function scenarios()
    {
        return [
            'login'=>[ 'username', 'password'],
            'register'=>['username', 'password','email']
        ];
    }

    public function login()
    {
        if( !$this->validate() )
            return false;
        $user = Users::findOne( [ 'username'=>$this->username ] );
        if( $user==null )
        {
            return false;
        }
        if( $user->password != $this->password )
        {
            return false;
        }

        return Yii::$app->user->login($user, $this->rememberMe ? 3600*24*30 : 0);
    }

    public function register()
    {
        return true;
    }





    /**
     * Finds an identity by the given ID.
     *
     * @param string|integer $id the ID to be looked for
     * @return IdentityInterface|null the identity object that matches the given ID.
     */
    public static function findIdentity($id)
    {
        return static::findOne(['id'=>$id]);
    }

    /**
     * Finds an identity by the given token.
     *
     * @param string $token the token to be looked for
     * @return IdentityInterface|null the identity object that matches the given token.
     */
    public static function findIdentityByAccessToken($token, $type = null)
    {
        return static::findOne(['access_token' => $token]);
    }

    /**
     * @return int|string current user ID
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @return string current user auth key
     */
    public function getAuthKey()
    {
        return $this->auth_key;
    }

    /**
     * @param string $authKey
     * @return boolean if auth key is valid for current user
     */
    public function validateAuthKey($authKey)
    {
        return $this->getAuthKey() === $authKey;
    }



}

然后再action里实现的代码如下

class DefaultController extends Controller
{
    public $layout = 'basic';

    public function actionIndex()
    {
        if( !Yii::$app->user->isGuest )
        {
            return  Yii::$app->getResponse()->redirect('?r=user/main/index');
        }
        else {
            $model = new Users();

            $model->setScenario('login');
            if ($model->load(Yii::$app->request->post()) && $model->login()) {
                return $this->redirect(['/user/main/index']);
            }
            else{
                return $this->render('login', ['model' => $model]);
            }
        }
    }
}

问题是,在验证通过重定向之后无法获取$app->user的属性,请问如何操作才正确呢?谢谢

  • 回答于 2015-05-03 13:05 举报

    首先,验证用户登录成功后的goback方法重定向对于你的问题是没有任何影响的,你也不用管它。(其实代码不复杂,和redirect基本相同)。我看了你的代码,没有发现问题,下面我建议你来检查一下:
    你试着登录成功之后让页面跳转redirect到主页,比如你的主页是/site/index,你在render之前写这样一句:

    if (\Yii::$app->user->isGuest==true) {
    echo "true";
    } else {
    echo "false";
    }
    

    看看能否输出false,如果没有说明没有登录成功。这和以下方法相似:
    注意看你的login菜单是否变成了logout(因为登录成功login菜单要变成logout原因如下views\layouts\main.php

    Yii::$app->user->isGuest ?
    ['label' => 'Login', 'url' => ['/site/login']] :
    ['label' => 'Logout (' . Yii::$app->user->identity->username . ')',
    'url' => ['/site/logout'],
    'linkOptions' => ['data-method' => 'post']],
    

    如果真的变成了logout,说明Yii::$app->user->isGuest变成了false,也就是\Yii::$app->user可以调用了,主页一定会有输出false才对。
    如果没有变成logout,主页也没有输出,说明登录并没有成功。

    2 条回复
    回复于 2015-05-11 13:12 回复

    谢谢你,这部分代码是没有问题的,问题在于,我忘了修改config里面user组件对应的类名了……

    回复于 2015-05-11 17:18 回复

    啊,所以说bug难寻

您需要登录后才可以回答。登录 | 立即注册
小黑豆
职场新人

小黑豆

注册时间:2014-12-18
最后登录:2015-10-07
在线时长:8小时1分
  • 粉丝2
  • 金钱15
  • 威望0
  • 积分95

热门问题