crowprince 2016-08-04 20:07:44 9697次浏览 3条评论 3 2 0

原文:http://blog.csdn.net/lx_96/article/details/52120469
如何使用yii\web\User类进行校验登录呢?请看下面内容:
1.如何与yii\web\User类进行关联呢?
首先你要在模型中实现一个接口:yii\web\IdentityInterface.

class User extends \app\base\core\BaseActiveRecord implements \yii\web\IdentityInterface//实现接口 

2.如何进行登录校验呢?
在模型中添加如下代码:

public function login(){  
   if(!$this->validate()){  
       return false;  
   }  
   $user = User::findOne(['username'=>$this->username,]);//通过用户输入的用户名重表中选出数据  
   if($user !== null){  
       if($this->validatePassword($this->psd,$user->password_hash)){    
           //密码校验,第一个参数为用户输入的密码,第二个为通过用户名选出来用户原本的hash加密的密码  
             
           Yii::$app->user->login($user,$this->rememberMe ? 3600*24*30 : 0);//rememberMe是“是否记住我”的选项值为bool型  
           //这是User类中的方法,第一个参数必须是IdentityInterface的实例。第二个参数就是你的cookie存活时间  
             
           return true;  
       }  
       return false;  
   }else{  
       return false;  
   }  
}  

3.控制器中代码如下:

public function actionLogin()  
{  
    if (!Yii::$app->user->isGuest) { //此处与以上的user为yii\web\User的实例  
        return $this->goHome();  
    }  
    $model = new User();  
    $ret = $model->load(Yii::$app->request->post());  
    $model->scenario = 'login';//为登录设置场景,看后面的分析  
    if($ret){  
        $model->psd = Yii::$app->request->post()['User']['psd'];//之所以如此赋值我也不知道为何我定义的变量通过load()方法赋值不了  
        $model->rememberMe = Yii::$app->request->post()['User']['rememberMe'];  
        if ($model->login()) {  
            return $this->goBack();  
        }  
    }  
    return $this->render('login', [  
        'model' => $model,  
    ]);  
}  

4.关于场景的说明:
4.1以下就是我在模型中分定义的场景:

public function scenarios()  
{  
   //默认场景,所有字段  
   $parent =    parent::scenarios(); // TODO: Change the autogenerated stub  
   $parent['login']=['username','psd'];  
   $parent['register']=['username','psd','email'];  
   return $parent;  
}  

就是对你要校验的模型实例设置一个场景,那么它经过rules方法时只校验你场景中设定的字段。我此处的登录场景只校验‘username',与'psd'.
4.2如何使用
正如上述控制器中的那样。
$model->scenario = 'login'.这样就为这个实例设置了场景。
原文:http://blog.csdn.net/lx_96/article/details/52120469

觉得很赞
  • 评论于 2016-08-30 13:59 举报

    人家本来就写有。。。

  • 评论于 2016-10-17 17:45 举报

    作为一个新手来说,我还是感谢一下

  • 评论于 2016-11-13 19:49 举报

    之所以没法通过load方法赋值,我知道的有三种情况,一种是你没有通过rules写那个字段,二model类里那个字段是public字段,三页面里表单中input的名字不是moudel[xxxx]这种形式

您需要登录后才可以评论。登录 | 立即注册