2011-10-12 68 views
7

如何注册CakePHP?如何进行会员注册确认?

注册后,会发送邮件确认。

如果我点击链接进行确认,那么账户将被确认。

我怎样才能做到这一点?

是否有任何功能与Auth做到这一点?

或者我是否必须手动发送邮件以确认注册?

如果我必须手动发送电子邮件以确认注册,那么我如何生成注册令牌,以及如何将时间设置为有效令牌?

任何人都可以显示这样的例子吗?

+0

谷歌说:http://www.jonnyreeves.co.uk/2008/06/cakephp-activating-user-account-via-email/ – Josh

回答

4

检查Cake Development Corporations用户插件的来源,它可用于CakepPHP 1.3和2.0。 https://github.com/cakedc/users它已经完成了所有工作 - 以适当的MVC和CakePHP方式 - 您提出要求。只需使用插件或采取一些代码。

+0

我不知道如何使用该插件,我已经有一个users_controller添加,编辑,删除,登录,注销操作。还有一个用户模型。然后,如果我运行这个命令,蛋糕迁移全部 - 插件用户,会发生什么? – shibly

+0

按照readme.md文件中的说明进行操作。您可以使用Cake模式导入数据库模式或使用需要迁移插件的Cake迁移。如果你已经有了一些重新开始使用插件,那么它已经完全测试过了(运行测试)并且扩展它。这也在readme.md – burzum

+0

中解释该插件是否可以与CakePHP-2.0一起使用? – shibly

2

您可以在PHP中轻松生成像令牌一样的哈希码,并通过TimeStamp验证其持续时间。对于电子邮件只需使用这样的电子邮件组件。如果您想使用Auth Component,请确保您的表单为您提供正确的密码散列。

function register() { 
    $error = false; 
    $error_captcha = null; 
    if(isset($this->data)){ 
     App::import('Component','Generate'); 
     App::import('Component', 'Converter'); 
     App::import('Component','Email'); 
     if(empty($this->data['User']['password'])||strlen($this->data['User']['password'])<5){ 
      $this->User->invalidate("password"); 
      $error = TRUE; 
     } 
     if($this->data['User']['password']<>$this->data['Temp']['password']){ 
      $this->User->invalidate("seotitle"); 
      $error = TRUE; 
     }  
     $captcha_respuesta = recaptcha_check_answer ($this->captcha_privatekey, 
     $_SERVER["REMOTE_ADDR"], 
     $_POST["recaptcha_challenge_field"], 
     $_POST["recaptcha_response_field"]); 
     if ($captcha_respuesta->is_valid && !$error) { 
     $this->data['User']['coderegistration'] = $this->generate->getUserCode(); 
     $this->data['User']['displayname'] = $this->data['User']['firstname'] . " " . $this->data['User']['lastname']; 
     $this->data['User']['seotitle'] = $this->converter->seotitle($this->data['User']['username']); 
     $this->data['User']['password'] = md5($this->data['User']['username'].$this->data['User']['password']); 
     $this->User->id = NULL; 
     if($this->User->save($this->data)){ 
      /* 
      ========================= 
      send email notification 
      ========================= 
      */ 
      $email = $this->data['User']['email'];    
      $content = sprintf('<a href="%s/%s">here</div>', $this->url, $this->data['User']['coderegistration']); 
      $this->email->to = $email; 
      $this->email->subject = 'you have been registered, please confirm'; 
      $this->email->replyTo = '[email protected]'; 
      $this->email->from = "name <[email protected]>";     
    $this->email->template = 'notification'; 
      $this->email->sendAs = 'html'; 
     $this->set('value', $content); 
     if($this->email->send()){ 
       // OK     
     }else{ 
      trigger_error("error Mail"); 
     } 
     } 




     }else{ 
      $error_captcha = $captcha_respuesta->error; 
      $this->set('error_email',true); 
     } 



    } 
    $this->setTitlePage(); 
    $this->layout = "home"; 
    $this->set('backurl', '/'); 
    $this->set('posturl',''); 
    $this->set('captcha_publickey',$this->captcha_publickey); 

    } 
+0

你能解释你的代码吗? – shibly

+0

它在注册生成的代码后发送电子邮件。您只需添加一个字段到您的用户表,代码,电子邮件地址和创建。当用户访问链接确认时,cakephp会收到代码并检查用户是否存在,如果创建的时间戳不是太旧,并且只将emailauthentificated字段设置为True。 – papachan

3

用户表:

CREATE TABLE IF NOT EXISTS `users` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `username` varchar(255) COLLATE utf8_persian_ci NOT NULL, 
    `password` varchar(255) COLLATE utf8_persian_ci NOT NULL, 
    `email` varchar(100) COLLATE utf8_persian_ci NOT NULL, 
    `created` datetime NOT NULL, 
    `status` tinyint(1) NOT NULL, 
    `activation_code` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `email` (`email`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci AUTO_INCREMENT=4 ; 

当用户注册,U可以设置一个唯一的字符串:在activation_code场(样本MD5(时间())或任何事情...)。 现在这个样子URL发送电子邮件给用户:

http://test/controller/action/activation_code 

现在你有你的行动来检查这activation_code是用户表或没有。

如果是那么是状态=禁用或不...

2

也发送电子邮件加载电子邮件组件。已经给出的注册函数是很好的,你应该去做。

基本的概念是添加用户,然后创建一个令牌(带时间戳ro)然后将其保存到数据库中,然后发送带有该令牌链接的电子邮件。

然后,当用户点击链接到令牌您设置用户=活动,他们现在注册并可以登录。

因此,为您的验证提供一个很好的提示是将“范围”(检查1.3的cakephp文档)添加到验证。使这个范围成为active = 1的条件。这样他们将需要通过电子邮件链接进行确认,并且直到完成后才能登录。简单!

+0

假设有人要求注册一个“用户名”,所以用户名和它的相关认证码被保存到数据库表中。现在如果有人想用相同的用户名注册会发生什么? – shibly

+0

那么用户已经存在这个用户名,所以当从注册表中保存一个用户时,你应该选择验证。在Cakephp中有一个isUnique()验证检查。您可以在您的用户名字段中使用该名称,并向用户报告他们想要的用户名已不存在的错误! –