Subversion-Projekte lars-tiefland.prado

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
1 lars 1
<com:TContent ID="Main">
2
 
3
<h1>Création de la page <tt>LoginUser</tt></h1>
4
 
5
<p>
6
La page <tt>LoginUser</tt> affiche un formulaire et gère l'authentification de l'utilisateur. Comme décrit dans <a href="?page=Day3.Auth">authentification et autorisation</a>, le navigateur est automatiquement redirigé vers la page <tt>LoginUser</tt> quand un utilisateur essaye d'accéder à une page protégée, telle que la page d'administration des utilisateurs.
7
</p>
8
 
9
<p>
10
Le processus de la page <tt>LoginUser</tt> est similaire à celui de la page <a href="?page=Day1.CreateContact">Contact</a>:
11
</p>
12
<ol>
13
<li>Quand un utilisateur accède à la page <tt>LoginUser</tt>, un formulaire est affiché;</li>
14
<li>L'utilisateur remplit les champs, nom de l'utilisateur et mot de passe et clique sur le bouton "envoyer";</li>
15
<li>La classe <tt>LoginUser</tt> reçoit l'évènement "login" et lance la séquence d'authentification;</li>
16
<li>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é.
17
</ol>
18
 
19
<p>
20
Nous créons les deux fichiers <tt>protected/pages/users/LoginUser.page</tt> et <tt>protected/pages/users/LoginUser.php</tt> qui enregistre le gabarit et la classe respectivement.
21
</p>
22
 
23
<h2>Création du gabarit</h2>
24
 
25
<p>
26
Ci-après est affiché le gabarit pour <tt>LoginUser</tt>. 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 <tt>TRequiredFieldValidator</tt> contrôle. La validité du mot de passe est assurée par le validateur <a href="http://www.pradosoft.com/demos/quickstart/index.php?page=Controls.Validation">TCustomValidator</a> qui fait un appel à la méthode <tt>validateUser()</tt> de la classe. La page contient aussi un bouton "envoyer" qui fait un appel à <tt>loginButtonClicked()</tt> quand il est activé.
27
</p>
28
 
29
<com:TTextHighlighter CssClass="source" Language="prado">
30
&lt;%@ Title="My Blog - Login" %>
31
 
32
&lt;com:TContent ID="Main">
33
 
34
<h1>Connexion</h1>
35
 
36
<span>Votre nom:</span>
37
&lt;com:TRequiredFieldValidator
38
    ControlToValidate="Username"
39
    ErrorMessage="Veuillez indiquer votre nom."
40
    Display="Dynamic" />
41
<br/>
42
&lt;com:TTextBox ID="Username" />
43
 
44
<br/>
45
<span>Mot de passe:</span>
46
&lt;com:TCustomValidator
47
    ControlToValidate="Password"
48
    ErrorMessage="vous avez saisi un mot de passe invalide."
49
    Display="Dynamic"
50
    OnServerValidate="validateUser" />
51
<br/>
52
&lt;com:TTextBox ID="Password" TextMode="Password" />
53
 
54
<br/>
55
&lt;com:TButton Text="Envoyer" OnClick="loginButtonClicked" />
56
 
57
&lt;/com:TContent>
58
</com:TTextHighlighter>
59
 
60
<h2>Création de la classe</h2>
61
 
62
<p>
63
Tout comme la page <a href="?page=Day1.CreateContact">Contact</a>, la page <tt>LoginUser</tt> 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 : <tt>validateUser()</tt> et <tt>loginButtonClicked()</tt>. Dans <tt>validateUser()</tt>, nous utilisons le <a href="?page=Day3.Auth">gestionnaire d'authentification</a> 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.
64
</p>
65
 
66
<com:TTextHighlighter CssClass="source" Language="php">
67
class LoginUser extends TPage
68
{
69
    /**
70
     * Vérifie la validité du nom d'utilisateur et du mot de passe.
71
     * Cette méthode implémente l'évènement <tt>OnServerValidate</tt> du validateur <tt>TCustomValidator</tt>.
72
     * @param mixed sender : celui qui a généré l'évènement
73
     * @param mixed param : paramètres de l'évènement
74
     */
75
    public function validateUser($sender,$param)
76
    {
77
        $authManager=$this->Application->getModule('auth');
78
        if(!$authManager->login($this->Username->Text,$this->Password->Text))
79
            $param->IsValid=false;  // indique au validateur que la validation à échoué
80
    }
81
 
82
    /**
83
     * Rédirige le navigateur vers l'URL originellement demandée si la validation est Ok.
84
     * Cette méthode implémente l'évènement <tt>OnClick</tt> du bouton "envoyer".
85
     * @param mixed sender : celui qui a généré l'évènement
86
     * @param mixed param : paramètres de l'évènement
87
     */
88
    public function loginButtonClicked($sender,$param)
89
    {
90
        if($this->Page->IsValid)  // toutes les validations sont ok ?
91
        {
92
            // récupère l'URL de la page protégée qui avait été demandée par l'utilisateur
93
            $url=$this->Application->getModule('auth')->ReturnUrl;
94
            if(empty($url))  // l'utilisateur à accéder à la page de connexion directement
95
                $url=$this->Service->DefaultPageUrl;
96
            $this->Response->redirect($url);
97
        }
98
    }
99
}
100
</com:TTextHighlighter>
101
 
102
 
103
<h2>Test</h2>
104
 
105
<p>
106
Nous avons donc créé la page <tt>LoginUser</tt>. Nous pouvons la tester en naviguant à l'URL <tt>http://hostname/blog/index.php?page=users.LoginUser</tt>. Rappellez-vous que la dans la section <a href="?page=Day2.CreateDB">Création de la base</a>, nous avons déjà créé deux comptes utilisateurs (nom d'utilisateur/mot de passe) <tt>admin/demo</tt> et <tt>demo/demo</tt>. Nous pouvons donc les utiliser pour tester notre page de connexion.
107
</p>
108
 
109
<img src="<%~ output.gif %>" class="output"/>
110
 
111
<h2>Ajout des liens de connexion/déconnexion à notre gabarit principal</h2>
112
<p>
113
Pour permettre à l'utilisateur d'accéder directement aux pages de connexion/déconnexion, nous modifions le gabarit principal <tt>MainLayout</tt>. En particulier, nous ajoutons un lien vers la page <tt>LoginUser</tt>. Nous ajoutons aussi un lien "se déconnecter" qui permet à l'utilisateur de se déconnecter.
114
</p>
115
 
116
<p>
117
Nous modifions le pied de page de notre gabarit principal <tt>MainLayout</tt>. 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: <tt>$this->User->IsGuest</tt> 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é.
118
</p>
119
 
120
<com:TTextHighlighter CssClass="source" Language="prado">
121
<div id="footer">
122
&lt;com:THyperLink Text="Se connecter"
123
    NavigateUrl="&lt;%= $this->Service->constructUrl('users.LoginUser') %>"
124
    Visible="&lt;%= $this->User->IsGuest %>" />
125
 
126
&lt;com:TLinkButton Text="Se déconnecter"
127
    OnClick="logoutButtonClicked"
128
    Visible="&lt;%= !$this->User->IsGuest %>" />
129
 
130
<br/>
131
&lt;%= PRADO::poweredByPrado() %>
132
</div>
133
</com:TTextHighlighter>
134
 
135
<p>
136
Vu que le lien "se déconnecter" génère l'évènement <tt>OnClick</tt> avec comme nom d'évènement <tt>logoutButtonClicked()</tt>, nous devons modifier le fichier de classe de <tt>MainLayout</tt> comme ci-dessous :
137
</p>
138
 
139
<com:TTextHighlighter CssClass="source" Language="php">
140
class MainLayout extends TTemplateControl
141
{
142
    /**
143
     * Déconnecte un utilisateur.
144
     * Cette méthode répond à l'évènement OnClick du lien "se déconnecter".
145
     * @param mixed sender : celui qui a généré l'évènement
146
     * @param mixed param : paramètres de l'évènement
147
     */
148
    public function logoutButtonClicked($sender,$param)
149
    {
150
        $this->Application->getModule('auth')->logout();
151
        $url=$this->Service->constructUrl($this->Service->DefaultPage);
152
        $this->Response->redirect($url);
153
    }
154
}
155
</com:TTextHighlighter>
156
 
157
<p>
158
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.
159
</p>
160
 
161
</com:TContent>