如何使用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'.这样就为这个实例设置了场景。