【问题标题】:YII2 - AuthorizationYII2 - 授权
【发布时间】:2017-02-07 06:01:42
【问题描述】:

我希望你能在我发疯之前帮助我。 我正在尝试登录用户。 这是actionLogin

public function actionLogin() {
    $model = new User();

    if ($model->load(Yii::$app->request->post()) && $model->validate()) {
        $arrPost = Yii::$app->request->post();

        $identity = User::findOne(['email'=>$arrPost['User']['email'],'password'=>$arrPost['User']['password']]);

        $identity->id = $identity->getAttribute('id');
        $identity->last_name = $identity->getAttribute('last_name');
        $identity->first_name = $identity->getAttribute('first_name');
        $identity->admin = $identity->getAttribute('admin');
        $identity->address = $identity->getAttribute('address');
        $identity->ministry = $identity->getAttribute('ministry');

        \yii::$app->user->login($identity,86400);                        

        return $this->redirect(Url::to(['app/index']));
    } else {
        // either the page is initially displayed or there is some validation error
        return $this->render("@app/forms/user/login", ['model' => $model]);
    }
}

如果我在之后做一个 var_dump

\yii::$app->user->login

我得到了以下转储

object(app\models\User)#88 (17) { ["id"]=> int(1) ["first_name"]=> string(12) "Christianfds" ["last_name"]=> string(7) "Köster" ["email"]=> NULL ["admin"]=> bool(true) ["password"]=> NULL ["address"]=> string(16) "Lieber Christian" ["ministry"]=> string(6) "" ["auth_key"]=> NULL ["_attributes":"yii\db\BaseActiveRecord":private]=> array(8) { ["id"]=> int(1) ["first_name"]=> string(12) "Christianfds" ["last_name"]=> string(7) "Köster" ["email"]=> string(25) "kirche@familie-koester.eu" ["admin"]=> bool(true) ["password"]=> string(5) "chris" ["address"]=> string(16) "Lieber Christian" ["ministry"]=> string(6) "Diakon" } ["_oldAttributes":"yii\db\BaseActiveRecord":private]=> array(8) { ["id"]=> int(1) ["first_name"]=> string(12) "Christianfds" ["last_name"]=> string(7) "Köster" ["email"]=> string(25) "kirche@familie-koester.eu" ["admin"]=> bool(true) ["password"]=> string(5) "chris" ["address"]=> string(16) "Lieber Christian" ["ministry"]=> string(6) "Diakon" } ["_related":"yii\db\BaseActiveRecord":private]=> array(0) { } ["_errors":"yii\base\Model":private]=> NULL ["_validators":"yii\base\Model":private]=> NULL ["_scenario":"yii\base\Model":private]=> string(7) "default" ["_events":"yii\base\Component":private]=> array(0) { } ["_behaviors":"yii\base\Component":private]=> array(0) { } }

您看,id、first_name、last_name 等字段已填满。在重定向到入口页面并在

上执行 var_dump 之后
\yii::$app->user->identity

我得到以下内容:

object(app\models\User)#93 (17) { ["id"]=> NULL ["first_name"]=> NULL ["last_name"]=> NULL ["email"]=> NULL ["admin"]=> NULL ["password"]=> NULL ["address"]=> NULL ["ministry"]=> NULL ["auth_key"]=> NULL ["_attributes":"yii\db\BaseActiveRecord":private]=> array(8) { ["id"]=> int(1) ["first_name"]=> string(12) "Christianfds" ["last_name"]=> string(7) "Koester" ["email"]=> string(25) "kirche@familie-koester.eu" ["admin"]=> bool(true) ["password"]=> string(5) "chris" ["address"]=> string(16) "Dear Christian" ["ministry"]=> string(6) "" } ["_oldAttributes":"yii\db\BaseActiveRecord":private]=> array(8) { ["id"]=> int(1) ["first_name"]=> string(12) "Christianfds" ["last_name"]=> string(7) "Koester" ["email"]=> string(25) "kirche@familie-koester.eu" ["admin"]=> bool(true) ["password"]=> string(5) "chris" ["address"]=> string(16) "Dear Christian" ["ministry"]=> string(6) "" } ["_related":"yii\db\BaseActiveRecord":private]=> array(0) { } ["_errors":"yii\base\Model":private]=> NULL ["_validators":"yii\base\Model":private]=> NULL ["_scenario":"yii\base\Model":private]=> string(7) "default" ["_events":"yii\base\Component":private]=> array(0) { } ["_behaviors":"yii\base\Component":private]=> array(0) { } }

您会看到 id、first_name、last_name 等的内容消失了。可以询问用户是否是访客,返回错误(用户已登录)。但我不可能从 id、first_name、last_name 等字段中获取值,因为它们是 NULL:

用户配置文件:

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

在我发疯之前谁能帮帮我!

谢谢 克里斯

【问题讨论】:

  • 老实说,您似乎不知道那里发生了什么:1)使用$modelload(),然后将纯POST传递给findOne() 2)再次设置属性已经获取相同属性的值 3) 在Yii::$app 中使用小写yii 而不是正确的Yii - 最后4) 不检查login() 是否返回falsetrue。我强烈推荐阅读The Definitive Guide to Yii 2.0

标签: php yii2 authorization


【解决方案1】:

有很多不必要的代码...如果所有其他事情都按计划进行,则可以简单地完成。

public function actionLogin() {
    $model = new User();
    if ($model->load(Yii::$app->request->post()) && $model->validate()) {
        \yii::$app->user->login($model); //does your user model have login function??                       
        return $this->redirect(Url::to(['app/index']));
    } else {
        return $this->render("@app/forms/user/login", ['model' => $model]);
    }
}

【讨论】:

    【解决方案2】:

    它按预期工作。从您的第二次转储中,很明显 已加载用户模型,例如“_attributes”已填充。

    我的假设是您的用户模型中有一些公共变量(id、last_name、first_name 等),例如:

    class User {
    
        public $id;
        public $last_name;
    
        ...
    }
    

    在您的 actionLogin() 中,您找到您的模型并为您的模型设置公共变量,然后尝试登录。 尽管您在登录之前设置了这些,但在重定向之后没有设置它们。这是意料之中的,因为您的模型实现了“yii\web\IdentityInterface”。

    当你登录成功时,会话中只保存身份的id,由:

    $identity->getId()
    

    不是用户模型本身。

    重定向到入口页面后,使用保存在会话中的id加载身份,使用函数:

    public static function findIdentity($id)
    

    用户模型。

    如果您想添加自己的变量,您可以在模型中编辑(或覆盖)此函数。 例如。

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

    改为:

    public static function findIdentity($id)
    {
        $identity =  static::findOne(['id' => $id, 'status' => self::STATUS_ACTIVE]);
    
        $identity->id = $identity->getAttribute('id');
        $identity->last_name = $identity->getAttribute('last_name');
        // etc.
        return $identity;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 2016-03-30
      • 2016-06-21
      • 2018-11-21
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多