2011-12-07 40 views
1

我为我的web应用程序使用PHP Zend框架。当用户注册时,我向他们发送一封电子邮件来验证他们的电子邮件地址,当他们点击该链接时 - 该帐户被激活。电子邮件验证后PHP自动登录用户

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

这是我在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); 
    } 

感谢您的帮助

+0

你使用Session来测试用户登录,他的角色等或Zend_Auth? –

+0

我只是使用Zend_Auth – Gublooo

回答

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

我不熟悉与Zend所以我做到了不看你的代码正常,但这里有一个想法:

  1. 发送的验证邮件
  2. 创建一个会话您发送邮件
  3. 等待之后...
  4. 用户点击邮件后,如果会话仍处于活动状态(通常此时间限制约为20分钟),只需登录他即可。

为了安全起见,您甚至可以创建两个会话。第一个将存储该id,第二个将存储一个guid。 guid也将在验证链接中发送给用户。所以当他/她点击链接并返回时,你会比较guid和id是否匹配。如果它匹配,就像登录脚本中那样登录它们。