二、用户注册端自动登录(注册后自动认证)



在yii中有一个Login操作,它需要

$model=new LoginForm; 

存储所有登录函数的位置。比如$model->login(),它完成了所有的认证过程。

现在当你注册时你采用不同的模型

    $model=new User;

因为你必须在用户数据库中存储新用户。

那么我如何在singup过程中将LoginForm合并到$model中以使用它的功能?因为我希望通过注册过程的用户自动登录。例如,我需要$model->login()代码,它存储在LoginForm

就像我在Login action中说的,有一个字符串如果(模型-> validate (),,模型->登录())

所以使用提供Jonny的链接我已经从这个

更新了一些代码
    if($model->validate())
    {
    if($model->save())

变成这样

if($model->validate())
            {
                $identity=new LoginForm($model->username,$model->password);
                $identity->login();
            if($model->save())

所以现在理论上我正在创建新的对象标识,传递用户名和密码给它,并调用登录函数。必须与"登录动作"相同。但是这个新用户还没有登录。

这里是完整的登录操作代码

public function actionLogin()
    {
        $model=new LoginForm;
        // if it is ajax validation request
        if(isset($_POST['ajax']) && $_POST['ajax']==='login-form')
        {
            echo CActiveForm::validate($model);
            Yii::app()->end();
        }
        // collect user input data
        if(isset($_POST['LoginForm']))
        {
            $model->attributes=$_POST['LoginForm'];
            // validate user input and redirect to the previous page if valid
            if($model->validate() && $model->login())
                $this->redirect(Yii::app()->user->returnUrl);
        }
        // display the login form
        $this->render('login',array('model'=>$model));
    }

还张贴了登录函数的代码,该代码保存在LoginForm

public function login()
    {
        if($this->_identity===null)
        {
            $this->_identity=new UserIdentity($this->username,$this->password);
            $this->_identity->authenticate();
        }
        if($this->_identity->errorCode===UserIdentity::ERROR_NONE)
        {
            $duration=$this->rememberMe ? 3600*24*30 : 0; // 30 days
            Yii::app()->user->login($this->_identity,$duration);
            return true;
        }
        else
            return false;
    } 

感谢Jonny,大家阅读他在评论中提供的链接,这是解决方案。

        $identity=new LoginForm();
        $identity->username=$model->username;
        $identity->password=$model->password;
        if($model->save()) {
            $identity->login();

只能像我一样手动发送用户名和模型,而不是像那个链接中那样,主要的事情是在触发登录函数之前在数据库中注册用户,因为登录函数会调用另一个家伙来检查数据库中是否有这个新用户。

最新更新