Création de la page LoginUser

La page LoginUser affiche un formulaire et gère l'authentification de l'utilisateur. Comme décrit dans authentification et autorisation, le navigateur est automatiquement redirigé vers la page LoginUser quand un utilisateur essaye d'accéder à une page protégée, telle que la page d'administration des utilisateurs.

Le processus de la page LoginUser est similaire à celui de la page Contact:

  1. Quand un utilisateur accède à la page LoginUser, un formulaire est affiché;
  2. L'utilisateur remplit les champs, nom de l'utilisateur et mot de passe et clique sur le bouton "envoyer";
  3. La classe LoginUser reçoit l'évènement "login" et lance la séquence d'authentification;
  4. Si le nom d'utilisateur et le mot de passe sont corrects, le système l'enregistre en session et le redirige vers la page protégée demandée. Dans le cas contraire, un message "mot de passe invalide" est affiché.

Nous créons les deux fichiers protected/pages/users/LoginUser.page et protected/pages/users/LoginUser.php qui enregistre le gabarit et la classe respectivement.

Création du gabarit

Ci-après est affiché le gabarit pour LoginUser. Comme vous pouvez le constater, la page contient un champ de saisie pour le nom de l'utilisateur et un autre pour le mot de passe. Le nom de l'utilisateur est requis, ce que le validateur TRequiredFieldValidator contrôle. La validité du mot de passe est assurée par le validateur TCustomValidator qui fait un appel à la méthode validateUser() de la classe. La page contient aussi un bouton "envoyer" qui fait un appel à loginButtonClicked() quand il est activé.

<%@ Title="My Blog - Login" %> <com:TContent ID="Main">

Connexion

Votre nom: <com:TRequiredFieldValidator ControlToValidate="Username" ErrorMessage="Veuillez indiquer votre nom." Display="Dynamic" />
<com:TTextBox ID="Username" />
Mot de passe: <com:TCustomValidator ControlToValidate="Password" ErrorMessage="vous avez saisi un mot de passe invalide." Display="Dynamic" OnServerValidate="validateUser" />
<com:TTextBox ID="Password" TextMode="Password" />
<com:TButton Text="Envoyer" OnClick="loginButtonClicked" /> </com:TContent>

Création de la classe

Tout comme la page Contact, la page LoginUser a aussi besoin d'un fichier de classe qui implémente les évènements générés dans le fichier gabarit. Ici, nous avons besoin de deux méthodes : validateUser() et loginButtonClicked(). Dans validateUser(), nous utilisons le gestionnaire d'authentification pour vérifier si le nom d'utilisateur et le mot de passe sont valides. Si c'est le cas, le gestionnaire d'authentification créé automatiquement une session utilisateur avec les données correspondantes.

class LoginUser extends TPage { /** * Vérifie la validité du nom d'utilisateur et du mot de passe. * Cette méthode implémente l'évènement OnServerValidate du validateur TCustomValidator. * @param mixed sender : celui qui a généré l'évènement * @param mixed param : paramètres de l'évènement */ public function validateUser($sender,$param) { $authManager=$this->Application->getModule('auth'); if(!$authManager->login($this->Username->Text,$this->Password->Text)) $param->IsValid=false; // indique au validateur que la validation à échoué } /** * Rédirige le navigateur vers l'URL originellement demandée si la validation est Ok. * Cette méthode implémente l'évènement OnClick du bouton "envoyer". * @param mixed sender : celui qui a généré l'évènement * @param mixed param : paramètres de l'évènement */ public function loginButtonClicked($sender,$param) { if($this->Page->IsValid) // toutes les validations sont ok ? { // récupère l'URL de la page protégée qui avait été demandée par l'utilisateur $url=$this->Application->getModule('auth')->ReturnUrl; if(empty($url)) // l'utilisateur à accéder à la page de connexion directement $url=$this->Service->DefaultPageUrl; $this->Response->redirect($url); } } }

Test

Nous avons donc créé la page LoginUser. Nous pouvons la tester en naviguant à l'URL http://hostname/blog/index.php?page=users.LoginUser. Rappellez-vous que la dans la section Création de la base, nous avons déjà créé deux comptes utilisateurs (nom d'utilisateur/mot de passe) admin/demo et demo/demo. Nous pouvons donc les utiliser pour tester notre page de connexion.

Ajout des liens de connexion/déconnexion à notre gabarit principal

Pour permettre à l'utilisateur d'accéder directement aux pages de connexion/déconnexion, nous modifions le gabarit principal MainLayout. En particulier, nous ajoutons un lien vers la page LoginUser. Nous ajoutons aussi un lien "se déconnecter" qui permet à l'utilisateur de se déconnecter.

Nous modifions le pied de page de notre gabarit principal MainLayout. La visibilité des liens vers "se connecter" et "se déconnecter" dépend du statut de l'utilisateur. Si l'utilisateur n'est pas encore connecté, ie: $this->User->IsGuest est vrai, alors le lien "se connecter" est visible tandis que le lien "se déconnecter" ne l'est pas et inversement s'il est connecté.

Vu que le lien "se déconnecter" génère l'évènement OnClick avec comme nom d'évènement logoutButtonClicked(), nous devons modifier le fichier de classe de MainLayout comme ci-dessous :

class MainLayout extends TTemplateControl { /** * Déconnecte un utilisateur. * Cette méthode répond à l'évènement OnClick du lien "se déconnecter". * @param mixed sender : celui qui a généré l'évènement * @param mixed param : paramètres de l'évènement */ public function logoutButtonClicked($sender,$param) { $this->Application->getModule('auth')->logout(); $url=$this->Service->constructUrl($this->Service->DefaultPage); $this->Response->redirect($url); } }

Maintenant si nous visitons n'importe quelle page de notre blog, nous verrons apparaitre un lien en pied de page. Le lien affiche "se connecter" si nous ne sommes pas connectés et "se déconnecter" dans le cas contraire. Si nous cliquons sur le lien "se déconnecter", nous sommes redirigés vers la page d'accueil et le lien "se connecter" apparait indiquant que nous ne sommes plus connectés.