Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework > MVC
MVC Forum de support sur le développement d'applications de type modèle-vue-contrôleur avec Zend Framework ainsi que vos questions sur les plugins, les helpers etc. Avant de poster -> Cours MVC, FAQ ZF Controller
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/03/2007, 12h59   #1
Invité de passage
 
Inscription : mars 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 5
Points : 2
Points : 2
Par défaut Problème de conception avec le modèle MVC et les sessions

Bonjour,

Je suis en train de concevoir un site sur la base de Zend Framework avec une page d'identification dont l'adresse est http://site/

Le site a l'arborescence suivante :
application
-->model
-->view
-->controller
Zend framework
-->zend

Après une authentification réussi l'utilisateur se retrouve sur son espace à l'adresse suivante :
http://site/home/

Jusqu'ici tout va bien. Le problème c'est qu'il est possible d'accèder directement à son espace sans s'authentifier en tapant directement "http://site/home/"

Comment interdire ce type de pratique et pallier à cette faille de sécurité?

j'ai pensé à une gestion par session et redirection mais là j'ai un probléme de conception. Dois mettre le contrôle au niveau de l'index? des controllers? ou des pages dans view? En gros comment faire?

Merci pour votre aide @+
kalidjinn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2007, 13h26   #2
Membre confirmé
 
Développeur Web
Inscription : septembre 2006
Messages : 215
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : septembre 2006
Messages : 215
Points : 246
Points : 246
Salut,

je pense qu'il faudrait que dans ton contrôleur HomeAction, tu vérifies si l'utilisateur a bien été logger, dans le cas contraire tu le rediriges.

il faudra sans doute que tu utilises les sessions dans ce cas là

sahid
sahid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2007, 13h40   #3
Invité de passage
 
Inscription : mars 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 5
Points : 2
Points : 2
ok.
Si je comprends bien tu me proposes de faire une vérification au niveau de chacunes des fonctions qui composent les controllers?! Comment optimiser le code?

C'est sûr que si je le faisais au niveau de l'index, je n'aurais qu'à le faire une fois

Ci-dessous le code d'un de mes controllers :
Code php :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 
<?php
Zend::loadClass("Zend_Controller_Action");
Zend::loadClass("Zend_Validate_EmailAddress");
Zend::loadClass("Zend_Filter_StripTags");
Zend::loadClass('Zend_Session');
 
class ConnexionController extends Zend_Controller_Action {
 
    public function displayAction() {
        // Récupération de la vue créée dans index.php
        $view = Zend::registry('view');
        // On appelle la vue qui devra 
        //s'afficher quand cette action est appellée
        echo $view->render('login.php');
    }
 
    public function checkinAction() {
        $view = Zend::registry('view');
 
        // vérifie l'existence d'un post :
        if (count($_POST) > 0) {
            // validation de l'email
            $email = $_POST["email"];
            $validator = new Zend_Validate_EmailAddress();
            if (!$validator->isValid($email)) {
                Zend_Log::log(
                     print_r($validator->getMessages(),true)
                );
                $this->_redirect(ROOT_URL."/connexion?error=email+faux");
            }
 
            // Check email/password in ADD
            Zend::loadClass("model_Query");
            $confdbQuery = model_Query::getInstance();
            $rows = sizeOf($Query->checkUser($email, $password));
 
            // redirection
            if($rows<1){
            	$this->_redirect(ROOT_URL."/connexion?error=email ou password+faux");
            }
            else {
	            $url = ROOT_URL."/home";
	            Zend_Log::log("before redirection, url=$url");
	            $this->_redirect($url);
            }
        }
        // si pas de POST, on affiche le formulaire
        echo $view->render("login.php");
    }
}
?>
Si on prend le code ci-dessus, il faudrait donc mettre une vérification au niveau de public function displayAction() et de public function checkinAction()?

Aurais tu une proposition?
kalidjinn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2007, 14h24   #4
Invité de passage
 
Inscription : octobre 2006
Messages : 3
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : octobre 2006
Messages : 3
Points : 4
Points : 4
Bonjour,

Pour créer un système d'authentification avec le Zend Framework je te propose plutôt d'utiliser Zend_Auth :
http://framework.zend.com/manual/en/zend.auth.html

Si tu veux pouvoir gérer différents niveaux de droits d'accès aux informations tu peux aussi utiliser Zend_Acl :
http://framework.zend.com/manual/en/zend.acl.html

Ensuite pour bien intégrer le système d'authenficiation tu peux utiliser le système de plugin du Zend_Controller_Front pour vérifier si tel ou tel controller et tel ou tel action a le droit d'être vu par tel utilisateur.

L'utilisation d'un plugin t'évitera de coller ton code de vérification un peu partout dans tes controlleurs.

Tu pourra trouver un petit exemple ici :
http://devzone.zend.com/node/view/id/1665
hrodwolf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2007, 15h21   #5
Invité de passage
 
Inscription : mars 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 5
Points : 2
Points : 2
Ca me paraît un peu compliqué tout ca alors que je veux juste que l'utilisateur passe avant tout par une authentification (login/mdp) pour accèder à son contenu et non pas directement en mettant une url qu'il aurait bookmarker par exemple.

La gestion des droits fera partie d'une prochaine étape.

Merci pour les liens quand meme mais mon probleme reste entier.
kalidjinn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2007, 15h33   #6
Membre éprouvé
 
Avatar de goodpz
 
Inscription : février 2007
Messages : 475
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 475
Points : 474
Points : 474
Sans passer par un plugin, tu pourrais simplement vérifier si le user est authentifié dans la method init() de ton controller Home (callée juste après le constructeur).

Autre solution, dans la method preDispatch() du Home controller, tu peux modifier le statut 'dispatched' de la requête et ainsi contourner l'appelle de l'action du controller (et repartir sur n'importe quel controller).

Si plusieurs de tes controllers ont besoins d'un user authentifié, tu peux créer une hierarchie de controllers (un seul controller parent redéfinirait preDispatch() ou init())
goodpz est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h55.


 
 
 
 
Partenaires

Hébergement Web