2011-10-12 13 views
7

Come posso registrarmi con CakePHP?Come posso confermare la registrazione del membro?

Dopo la registrazione, invierà un'e-mail per la conferma.

Se faccio clic sul collegamento per la conferma, l'account verrà confermato.

Come posso fare questo?

C'è qualche funzione con Auth per farlo?

Oppure devo inviare la posta manualmente per confermare la registrazione?

Se devo inviare manualmente l'e-mail per confermare la registrazione, come posso generare il token di registrazione e come posso impostare il tempo per essere un token valido?

Qualcuno può mostrare un esempio di questo?

+0

Google dice: http://www.jonnyreeves.co.uk/2008/06/cakephp-activating-user-account-via-email/ – Josh

risposta

4

Controllare la fonte del plug-in Utenti Cake Development Corporation, disponibile per CakepPHP 1.3 e 2.0. https://github.com/cakedc/users Fa già tutto - in un modo corretto MVC e CakePHP - che richiedi. Basta usare il plugin o prendere parte del codice.

+0

Non sono sicuro di come usare quel plugin, ho già un users_controller con le azioni aggiungi, modifica, cancella, login, logout. C'è anche un modello utente. Quindi se eseguo questo comando, torta migrazione tutti gli utenti di -plugin, cosa accadrebbe? – shibly

+0

Seguire le istruzioni nel file readme.md. È possibile utilizzare lo schema di torta per importare lo schema del database o utilizzare la migrazione di torta che richiede il plug-in di migrazione. Se hai già qualcosa da ricominciare e usa il plugin, è completamente testato (esegui i test) ed estendi. Questo è spiegato anche nel readme.md – burzum

+0

Questo plug-in funziona con CakePHP-2.0? – shibly

2

È possibile generare facilmente un codice hash come un token in PHP e convalidarne la durata da un TimeStamp. Per email basta usare il componente Email come questo. Se si desidera utilizzare Auth Component, assicurarsi che il modulo fornisca l'hash corretto per la password.

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

Puoi spiegare il tuo codice? – shibly

+0

Invia un'e-mail dopo essersi registrato con un codice generato. È sufficiente aggiungere un campo alla tabella utente, codice, e-mailautenticato e creato.Quando l'utente visita la conferma del collegamento, cakephp riceve il codice e controlla se l'utente esiste, se il timestamp creato non è troppo vecchio e imposta semplicemente il campo emailautentato su True. – papachan

3

tabella utente:

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 ; 

quando l'utente registrato, u possibile impostare una stringa univoca (campione: md5 (time()) o qualsiasi cosa ...) nel campo activation_code. invia una e-mail come questo url per l'utente:

http://test/controller/action/activation_code 

ora si deve controllare nella vostra azione che questo activation_code è nella tabella utente o meno.

e se è quindi è che lo status = disabilitare o no ....

2

di inviare l'e-mail caricare il componente e-mail anche. La funzione di registro fornita è già buona e dovresti farlo.

fondamentalmente il concetto è di aggiungere utente, quindi creare un token (con timestamp ro qualunque) e salvarlo in un database, quindi inviare un messaggio di posta elettronica con un link a quel token.

Quindi quando l'utente fa clic sul collegamento al token si imposta user = active e ora sono registrati e possono accedere.

Un buon suggerimento per il tuo Auth pertanto è aggiungere un "scope" (controlla i documenti cakephp per 1.3) ad Auth. Rendi questo ambito la condtion che attiva = 1. Quindi in questo modo dovranno essere confermati dal link email e non potranno mai effettuare il login fino a quando non verrà fatto. Facile!

+0

Supponiamo che uno abbia richiesto di registrarsi con un "nome utente", quindi il nome utente e il relativo codice di autenticazione relavent vengono salvati nella tabella del database. Ora se qualcun altro vuole registrarsi con lo stesso nome utente cosa accadrebbe? – shibly

+0

bene allora esiste già un utente con quel nome utente, quindi dovresti selezionarlo con la convalida quando salvi un utente dal modulo di registrazione. Esiste un controllo di convalida isUnique() in Cakephp. Puoi usarlo sul campo del tuo nome utente e segnalare un errore all'utente che il nome utente desiderato è scomparso! –

Problemi correlati