2016-08-23 50 views
3

我想通過發送帶有令牌鏈接的電子郵件來驗證用戶註冊的電子郵件(例如:http://example.com/user/autenticate/verify/abG12Fdss67j3kgfdds4jdpa74FiP9),因此如果找到該令牌,系統(在Zend Framework 2中)在數據庫中,預先註冊的賬戶進入VERIFIED狀態。Zend Framework 2電子郵件令牌驗證

我使用的是路線module.config.php這樣的:

'verify' => array(
      'type' => 'Segment', 
      'options' => array(
       'route' => '/user/autenticate/verify/:token', 
       'defaults' => array(
        '__NAMESPACE__' => 'User\Controller', 
        'controller' => 'Autenticate', 
        'action'  => 'verify', 
       ), 
        'constraints' => array(
        'token' => '[a-zA-Z0-9]{30}' 
       ), 
      ), 
     ), 

然後在AutenticateController.php,以下操作方法:

public function verifyAction() 
{ 
    sleep(3); // Delay against brute attack (is it useful?) 
    $token = $this->params()->fromRoute('token'); 
    $registerverification = new RegisterVerification(); 

    try { 
     $registerverification = $this->getRegisterVerificationTable()->getRegisterVerification($token); 

     // If arrives here (no exception) means that the token was in the database 
     $aux = $this->getRegisterVerificationTable()->deleteRegisterVerification($token); 
     $user = new User(); 
     $user = $this->getUserTable()->getUser((int)$registerverification->id); 
     $user->verified = date("Y-m-d H:i:s"); 
     $this->getUserTable()->saveUser($user); 

     $this->flashMessenger()->addMessage("Now your account is active"); 
    } catch (\Exception $e) { // Could not find row: $token 

     $this->flashMessenger()->addMessage($e->getMessage()); 
    } 
    return array(); 
} 

而且這樣的verify.phtml :

<?php 
echo $this->flashMessenger()->render(); 
?> 

這是工作,而不是在第一次嘗試,但只有在刷新URL(http://example.com/user/autenticate/verify/abG12Fdss67j3kgfdds4jdpa74FiP9)之後。

任何人都可以幫助我做些什麼來使第一次調用URL時執行AutenticateController.php的方法verifyAction()?

回答

2

flash messenger被設計爲在下一個請求上顯示消息,因此您可能希望在添加成功消息後重定向到另一個URL。這可能是唯一的問題(否則請讓我們知道第一次請求會發生什麼)。

+0

精彩@Tim!我創建了一個新的verifyanswerAction(使用它的視圖和它的路由),並添加了一個_return $ this-> redirect() - > toRoute('verifyanswer'); _和verifyAction的結尾,而不是前面的_return array(); _和它工作正常。 –

+0

順便說一句@Tim(我不知道我是否可以在這裏提出這個問題),你認爲它是有用的_sleep(3); _指令在verifyAction()開始對試圖令牌的機器人? –

+0

您可能想將睡眠轉移到您的catch {}(所以只有提交無效令牌的人才會受到懲罰)。 –