2016-11-12 49 views
0

我想就通过电子邮件激活用户的最有效方式提出一些建议。当用户注册时,我想要创建一个激活码,它将通过电子邮件发送,表示他们需要激活(激活码以域名作为参数以令牌形式发送)。但是,我不知道什么最好的数据库结构来处理这将是...通过电子邮件laravel(5.3)处理用户激活的数据库设置?

简单的选择,我相信,将有在users表中activation_tokenactivated列,当URL与匹配用户和activation_token被击中,activated将变为true /!0。虽然很简单,但我希望在用户表上尽可能节省空间。

或者,我可以制作一个包含user_id, token, activatedactivation表,并创建usersactivation之间的一对一关系。在User型号有:

public function activation() { 
    return $this->hasOne('App\Activation'); 
} 

public function activated() { 
    return $this->activation->activated != 0 ? true:false; 
} 

同样,当令牌参数的URL被击中的用户,更改activated 1 /真。

激活链接和注册确认正被推送到一个队列中,所以我不会过分担心用户可以激活的速度,但更多的时间是用来验证用户的额外时间额外的参数是必需的。

我确定有可能有更好的方法来做到这一点,但在谷歌搜索用户激活laravel 5.3后,结果通常是过时的方法和laravel版本的过时包或教程。除此之外,可用软件包并不特别轻巧,并且具有许多我根本不需要的配置设置,因此不需要,因为当我自己能够做到这一点时,我看不到堵塞的重点。我也不愿意拖过别人的包裹,并删除不必要的批量(根据我的需要)。

那么,任何人都可以请建议一个更好的选择,或支持上述想法之一?

回答

0

您可以使用在用户电子邮件上发送激活链接的技术来激活自己的帐户。由于答案会是一个很长,但我会尽量做到了尽可能短:

的用户的模式是这样的:

users 
    - id 
    - name 
    - email 
    - is_email_activated 
    - activation_token 

控制器会是这样(而创建帐户的用户):

class UsersController { 

    function create() { 
     $user = User::create(request()->all()); 

     $activation_token = $this->encryptData($user->id); 
     $activation_link = route('verify_token', ['token' => $activation_token]); 

     $user->activation_token = $activation_token; 
     $user->save(); 

     // Send mail to user with activation link... 
    } 

    function encryptData($id, $delimiter='|', $expiry = 1) { 
     $data[] = $id; 
     $data[] = rand(0,999999); 
     $data[] = time(); // This param can help us to retrieve the token generation time at the time of verification 
     $key = implode($delimiter, $data); 
     $key = Crypt::encrypt($key); 
     return $key; 
    } 

} 

现在发送到用户的电子邮件中的链接应指向的路径:

Route::get('users/activation/{token}', [email protected])->name('verify_token'); 

验证方法如下所示:

class UsersController { 

    function verifyToken($key) { 
     $key = Crypt::decrypt($key); 
     $data = explode("|", $key); 
     $data['id'] = $data[0]; 
     $data['previous_time'] = $data[2]; 
     $data['success'] = true; 

     $user = User::find($data['id']) 

     // Token valid if user is found and token is valid for only 24 Hrs Check (not mandatory in case of email activation, you should use this in case of resetting user's password) 
     if($user && (time() - ($data['previous_time'] <= 86400))) { 
      // User validated and make is_email_activated column to true/1 
     } 
    } 

} 

希望这有助于您!

相关问题