redirect dopo tentativo d'accesso

Buona sera a tutti!

Sto sviluppando la mia prima applicazione con yii, in particolare sto sviluppando la parte inerente l’accesso degli utenti. Un utente dopo essersi registrato deve confermare la registrazione cliccando su di un link inviato per email altrimenti l’utente risulta registrato ma non attivo. Vorrei fare in modo che se un utente non ancora attivo tenta di effettuare l’accesso questo venga reindirizzato ad una pagina in cui può chiedere di rinviare l’email di conferma o di cambiare l’indirizzo email di registrazione, come posso fare?

Se l’utente sta cercando di fare accesso, il metodo che viene chiamato è sicuramente SiteController::actionLogin();

E sicuramente nel tuo actionLogin(); dovresti avere uno snippet di codice così composto:




    if (isset($_POST['LoginForm'])) {

      $model->attributes = $_POST['LoginForm'];

      if ($model->validate() && $model->login())

        $this->redirect(Yii::app()->user->returnUrl);

    }



Puoi provare ad aggiungere queste due righe di codice:




    if (isset($_POST['LoginForm'])) {

      $model->attributes = $_POST['LoginForm'];

      if ($model->validate() && $model->login())

        $this->redirect(Yii::app()->user->returnUrl);

      else

        $this->redirect('site/resendEmail');

    }



Ovviamente il mio è solo un esempio. Ma dovrebbe bastarti per modificare il controller per le tue esigenze.

Grazie della risposta,

ho già provato a fare una cosa del genere ma in questo modo verrei reindirizzato alla pagina ‘site/resendEmail’ anche se l’utente ha sbagliato ad inserire i dati d’accesso o se l’utente semplicemente non si è ancora registrato.

Come faccio a capire che tipo di errore il $model->login() ha generato e comportarmi di conseguenza?

Hai ragione: ho dimenticato quella parte. Se l’utente ha inviato il form, e non è stato autenticato correttamente si ritroverà nell’else. A questo punto controlliamo email ed active. Non so se il codice che ho scritto è corretto. Ma è sicuramente una traccia da cui partire.




    if (isset($_POST['LoginForm'])) {

      $model->attributes = $_POST['LoginForm'];

      if ($model->validate() && $model->login())

        $this->redirect(Yii::app()->user->returnUrl);

      else {

        $condition = 'email = "'. $model->email .'" and active = 0';

        $finduser = Utenti::model->findAll();

        $isNotActive = count($findUser) > 0 ? true : false;

        if($isNotActive)

          $this->redirect('site/resendEmail');

      }

    }



Così dovrebbe funzionare, ma andrei ad interrogare due volte il database per ottenere le stesse informazioni, una volta nell’userIdentity e la seconda volta nell’actionLogin().

Un’altra soluzione sarebbe quella di inserire in LoginForm informazioni più dettagliate sull’errore che ha impedito l’utente di autenticarsi ma probabilmente così aggiungerei al LoginForm della logica che con il LoginForm non ha nulla a che fare…

Un’idea che mi è venuta ora leggendo alcuni articoli sull’rbac di yii e che potrei far comunque loggare l’utente anche se non ancora attivo, controllare il suo stato in questo modo


Yii::app()->user->status;

, reindirizzarlo alla pagina ‘site/resendEmail’ nel caso in cui l’utente fosse nell stato ‘inattivo’ e soprattutto limitare il suo accesso alle sole funzioni di gestione del proprio profilo (oltre che alle funzioni accessibili anche dagli utenti guest) tramite rbac.

Che ne dici?

Dipende: che differenza c’è tra un utente attivo ed uno non attivo?

L’utente non attivo non può pubblicare le sue offerte di lavoro, e può accedere solo alle offerte disponibili per tutti (utenti registrati e non).

L’amministratore deve poter contattare l’utente appena registrato per confermare la sua identità prima di dargli il permesso di pubblicare qualcosa

Non vedo differenza tra un non registrato ed un non attivo. Quindi non comprendo come mai tu lo voglia autenticare comunque anche se non è attivo.

Si hai ragione, per quel che ho detto prima in effetti non c’è alcuna differenza tra inattivo e non registrato. In realtà c’è una differenza, l’utente registrato ma non ancora attivo può accedere al proprio profilo e modificare i suoi dati (compresa l’email) e chiedere il rinvio dell’email di conferma, questa è l’unica differenza che c’è fra i due…

Piccolo consiglio quando si vuole verificare l’esistenza di un record in base ad una query. Non usare findAll(), Yii mette a disposizione

Anch’io sto cercando d’implementare la registrazione di un nuovo utente con l’invio di una mail di conferma.

La prima cosa che dovrebbe fare l’applicazione è chiedere la sola email all’utente.

Poi dovrebbe partire una mail di conferma all’utente registrato

E una volta confermato, cliccando sul link contenuto nella mail, può proseguire inserendo il resto dei dati di registrazione.

Stavo pensando di prendere spunto da questo corso base:

http://www.mtxweb.ch/php_learn/?p=665

anche per meglio capire le differenze tra usare una programmazione ben fatta, ma comunque tradizionale,

e quella mediante l’utilizzo di un potente framework 2.0.

Ho ancora un pò di confusione in testa e volevo chiarire i miei dubbi.

I miei dubbi nascono dalla lettura delle best practices di programmazione su yii, dove spiegano che nel controller dovrebbero essere sempre scritte poche righe di programmazione, cosa che condivido.

E il grosso dovrebbe essere scritto nel modello.

Negli screen cast è spiegato come passare i dati da controller a view, ma non ho trovato alcun esempio che spieghi come si faccia per interagire col modello.

Proseguendo in questo piccolo esempio. io farei così:

Per prima cosa creo la tabella user e poi la classe associata tramite gii (quindi creo il modello User)

Poi sempre tramite gii, creerei il controller per la gestione della registrazione.





<?php


class IscrizioneController extends Controller

{

	public function actionIndex()

	{

		if(isset($_REQUEST['mail'])) {

			//verificata che la mail sia formalmente corretta

			//genero il link, mando la mail			

			//....

			//dove e come lo metto questo spezzone di codice? 

			//....

			//visualizzo il layout in cui invito l'utente a controllare la sua posta elettronica

			$this->render('ok');

		} else {

			$this->render('index'); //visualizzo il form per richiedere la mail

		}

	}


	

	public function actionMail()

	{

		die('qui gestisco il link di accettazione della mail');

	}

}

?>



Ecco a questo punto, ho le idee molto vaghe.

Dove e come lo inserisco il codice di controllo?

nella classe User? O ne devo creare una nuova? E la creo manualmente o esiste qualche tool?

Sono più o meno riuscito a rispondere ai miei dubbi.

Ho anche pubblicato una piccola guida in proposito, qualora dovesse servire a qualcun’altro.

Adesso il model l’ho ben capito.

Mi rimane ancora da capire come implementare la mail di verifica.

Speriamo di ricevere presto qualche dritta

Ho una mezza voglia di creare un modulo per la registrazione degli utenti.