2011-10-12 4 views
7

CakePHPに登録するにはどうしたらいいですか?メンバー登録の確認はどうすればできますか?

登録後、確認のためメールが送信されます。

確認のためにリンクをクリックすると、アカウントが確認されます。

どうすればいいですか?

これを行うための認証機能はありますか?

登録を確認するためにメールを手動で送信する必要はありますか?私は登録を確認するために、手動で電子メールを送信する必要がある場合は

は、その後、どのように私は、登録トークンを生成することができ、そしてどのように私は、有効なトークンになるまでの時間を設定することができますか?

誰でもこの例を表示できますか?

+0

Googleは言う: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ファイルの指示に従ってください。ケーキスキーマを使用してデータベーススキーマをインポートするか、または移行プラグインが必要なケーキの移行を使用できます。あなたがすでに何かをやり直してプラグインを使って、それが完全にテストされていれば(テストを実行して)、プラグインを拡張します。これはreadme.mdでも説明されています – burzum

+0

そのプラグインはCakePHP-2.0で動作しますか? – shibly

2

PHPでトークンのようなハッシュコードを簡単に生成し、その有効期間をタイムスタンプで検証できます。電子メールの場合は、このような電子メールコンポーネントを使用してください。認証コンポーネントを使用する場合は、フォームに正しいパスワードハッシュを指定してください。

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

ユーザテーブル:activation_codeフィールドに:(MD5(時間())、または任意のもの...サンプル)ユーザーが登録したときに

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は一意の文字列を設定することができます。 は現在のユーザーにこのURLのような電子メールを送信:

http://test/controller/action/activation_code 

今、あなたはこのactivation_codeは、ユーザーテーブルにあるか、ないことを、あなたの行動をチェックインする必要があります。

と場合は、その後でそのステータスである=また、電子メールのコンポーネントをロードする電子メールを送信するために....

2

を無効にするかではありません。すでに与えられたレジスタ関数は良いものです。

は基本的な概念は、そのトークンへのリンクを含む電子メールを送信し、その後、(どんなタイムスタンプRO付き)トークンを作成し、ユーザーを追加し、データベースにこれを保存することです。

ユーザーがトークンへのリンクをクリックすると、user = activeが設定され、今登録されてログインできます。

あなたの認証のための良いヒントは、したがって、認証に「スコープ」(1.3のためのCakePHPのドキュメントを確認してください)を追加することです。このスコープをactive = 1という条件にしてください。そのようにすると、電子メールリンクから確認する必要があり、これが完了するまでログインすることはできません。簡単!

+0

ユーザ名とそのrelavent認証コードがデータベーステーブルに保存されるように、 "username"で登録を要求したとします。今、他の誰かが同じユーザ名で登録したい場合はどうなりますか? – shibly

+0

そのユーザー名を持つユーザーが既に存在しているため、登録フォームからユーザーを保存するときに検証を行います。 CakephpにisUnique()検証チェックがあります。これをあなたのユーザ名フィールドに使用して、ユーザに必要なユーザ名がなくなったというエラーをユーザに報告することができます! –

関連する問題