7

CakePHPに登録するにはどうすればよいですか?

登録後、確認メールを送信します。

リンクをクリックして確認すると、アカウントが確認されます。

これどうやってするの?

それを行うためのAuth機能はありますか?

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

登録を確認するために手動で電子メールを送信する必要がある場合、登録トークンを生成するにはどうすればよいですか?また、有効なトークンになるように時間を設定するにはどうすればよいですか?

誰かがこれの例を示すことができますか?

4

4 に答える 4

4

CakepPHP 1.3 および 2.0 で利用可能な Cake Development Corporations ユーザー プラグインのソースを確認してください。https://github.com/cakedc/usersそれはすでにあなたが要求するすべてを - 適切な MVC と CakePHP の方法で - 実行します。プラグインを使用するか、コードの一部を取得するだけです。

于 2011-10-13T10:00:14.020 に答える
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(time())またはその他...)を設定できます。次のURLのようなメールをユーザーに送信します。

http://test/controller/action/activation_code

ここで、このactivation_codeがユーザーテーブルにあるかどうかをアクションでチェックインする必要があります。

もしそうなら、そのステータス=無効にするかどうか...。

于 2011-10-12T10:45:35.333 に答える
2

電子メールを送信するには、電子メール コンポーネントもロードします。すでに与えられている登録機能は優れているので、それを使用する必要があります。

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

次に、ユーザーがトークンへのリンクをクリックすると、ユーザー = アクティブに設定され、登録されてログインできるようになります。

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

于 2011-10-12T11:34:11.407 に答える
2

PHP でトークンのようなハッシュコードを簡単に生成し、TimeStamp でその期間を検証できます。メールの場合は、このようにメール コンポーネントを使用します。認証コンポーネントを使用する場合は、フォームがパスワードの正しいハッシュを提供していることを確認してください。

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 = 'mail@mail.com'; 
            $this->email->from = "name <mail@mail.com>";                
    $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);

    }
于 2011-10-12T01:38:47.270 に答える