电子邮件验证后自动登录PHP用户

时间:2011-12-07 10:03:39

标签: php zend-framework zend-form zend-db

我正在为我的Web应用程序使用PHP Zend框架。当用户注册时,我会向他们发送电子邮件以验证他们的电子邮件地址,当他们点击该链接时 - 帐户已激活。

我的问题 - 当用户点击激活链接时 - 我也想自动登录 - 而不是要求他们再次登录。我不知道该怎么做。

这是我在Zend中的登录操作,需要电子邮件地址和密码。那么我应该将什么作为激活链接的一部分发送,以便当用户点击它时,它们会自动登录。

    $db = Zend_Db_Table::getDefaultAdapter();
    //create the auth adapter
    $authAdapter = new Zend_Auth_Adapter_DbTable($db, 'user','email', 'password');
    //set the username and password
    $authAdapter->setIdentity($this->_getParam('email'));
    $authAdapter->setCredential(md5($this->_getParam('password')));


    //authenticate
    $result = $authAdapter->authenticate();

    if ($result->isValid()) {           
        $auth = Zend_Auth::getInstance();
        $storage = $auth->getStorage();

        $row = $authAdapter->getResultRowObject(array('user_id'));
        $userModel = new Model_User();
        $user = $userModel->loadUserProfile($row->user_id);
        $storage->write($user);
    }

感谢您的帮助

2 个答案:

答案 0 :(得分:8)

您有一个if语句来验证用户名和密码。如果某人验证了他们的电子邮件,则您正在模仿此过程并允许用户通过电子邮件和验证密钥对其帐户进行身份验证。

您需要做的就是验证电子邮件和验证是否正确,并将此条件放在下面:

   .
   .
   .
   $verified = $emailVerification->isValid( $email, $key );

    if ( $verified ) 
    {           
            $auth = Zend_Auth::getInstance();
            $storage = $auth->getStorage();

            $row = $authAdapter->getResultRowObject(array('user_id'));
            $userModel = new Model_User();
            $user = $userModel->loadUserProfile($row->user_id);
            $storage->write($user);
    }

用户将在将用户详细信息保存到Zend_Auth存储引擎后登录。

我建议在使用此方法后从用户记录中删除验证密钥,以确保他们无法再次通过此过程登录,除非他们忘记了密码,如果您分配了新的验证密钥。

希望这有帮助!

答案 1 :(得分:1)

我对zend不熟悉,所以我没有正确查看你的代码,但这是一个想法:

  1. 发送验证邮件
  2. 发送邮件后创建会话
  3. 等等......
  4. 用户点击邮件后,如果会话仍处于活动状态(通常此时间限制为20分钟),只需登录即可。
  5. 为了安全起见,您甚至可以创建两个会话。第一个将存储id,第二个将存储guid。 guid也将在验证链接中发送给用户。因此,当他/她单击链接并返回时,您将比较guid和id是否匹配。如果匹配,只需像登录脚本中那样登录。