Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MkFramework Discussion :

Redirection après Authentification


Sujet :

MkFramework

  1. #1
    Nouveau membre du Club
    Redirection après Authentification
    Bonjour à tous,

    J'essaie de construire un site avec espace public/espace privé. J'y parviens assez bien avec le module auth, mais j'ai un problème auquel notre ami imikado va sans doute pouvoir répondre aisément.

    Lorsque que j'accède, à partir de l'espace public, à une page de l'espace privé, je suis normalement orienté vers la page Login si je ne suis pas connecté.

    Le process login dans le main.php me permet ensuite de valider la connexion à l'aide de la fonction checkLoginPass().

    Mais je voudrais que suite à cette vérification, je puisse rediger vers la page cible, et non la page index comme c'est le cas actuellement.

    Il faudrait donc que je puisse récupérer, à un moment du process, le couple module::page cible avant orientation vers la page login, pour pouvoir ensuite le passer dans la fonction redirect qui termine la fonction checkLoginPass().

    Comment faire çà ?

    Ylian

  2. #2
    Rédacteur

    Bonjour,
    Vous pouvez modifier simplement la redirection

    Votre méthode checkLoginPass de votre module d'authentification doit ressembler à ça
    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    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
     
    private function checkLoginPass(){
    		//si le formulaire n'est pas envoye on s'arrete la
    		if(!_root::getRequest()->isPost() ){
    			return null;
    		}
     
    		$sLogin=_root::getParam('login');
    		$sPassword=_root::getParam('password');
     
    		if(strlen($sPassword > $this->maxPasswordLength)){
    			return 'Mot de passe trop long';
    		}
     
    		//on stoque les mots de passe hashe dans la classe model_user
    		$sHashPassword=model_user::getInstance()->hashPassword($sPassword);
    		$tAccount=model_user::getInstance()->getListAccount();
     
    		//on va verifier que l'on trouve dans le tableau retourne par notre model
    		//l'entree $tAccount[ login ][ mot de passe hashe ]
    		if(!_root::getAuth()->checkLoginPass($tAccount,$sLogin,$sHashPassword)){
    			return 'Mauvais login/mot de passe';
    		}
     
    		_root::redirect('default::index');
    	}


    il suffit de modifier la dernière ligne concernant la redirection, ici vers default::index (action _index du module default)
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  3. #3
    Nouveau membre du Club
    cela, je l'avais bien compris. Le problème est de capturer ou récupérer la page appelante avant le login, parce que toute page de l'espace privé doit pouvoir être conservée par le module auth pour pouvoir ensuite faire l'objet de cette redirection.

  4. #4
    Rédacteur

    Autant pour moi
    Dans ce cas là, il faut modifier le plugin_auth

    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public function isConnected(){
             if(!$this->_isConnected()){
                  return false;
              }


    Cette méthode étant appelée pour justement vérifier que l'internaute est connecté ou non avant de rediriger

    Ici: avant le return fase, vous devriez ajouter un enregistrement de la page demandé dans le tableau de session

    Ainsi, suite au checkLoginPass, vous pourriez, si cette variable est enregistré redirigé vers cette page
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  5. #5
    Nouveau membre du Club
    Donc, au niveau du module auth, je dois récupérer le couple module::page de la page demandée.

    Question 1 : est-ce qu'on dispose d'une fonction dans le framework pour obtenir le lien de la page en cours (équivalent d'un HTTP_REFERER ou d'un PHP_SELF)

    Question 2 : est-ce que la capture de cette adresse doit se faire dans le before du module cible ou dans le before du module auth ?

  6. #6
    Rédacteur

    Non ce n'est pas ce que j'ai dit:

    Dans le plugin plugin_auth, dans la méthode isConnected, qui est appelé sur chaque page, on va ajouter avant le return false un enregistrement de la page demandée
    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public function isConnected(){
    		if(!$this->_isConnected()){
    			if(_root::getParamNav()!='auth::login'){
    			$_SESSION['pageDemandee']=_root::getParamNav();
    			}
    			return false;
    		}
     
    		$this->setAccount(unserialize($_SESSION['oAccount']));
     
    		//ajouter critere supp pour verification de l'authentification
    		return true;
    	}


    Et dans le module auth, methode checkLoginPass, au lieu de
    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    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
     
     
    private function checkLoginPass(){
    		//si le formulaire n'est pas envoye on s'arrete la
    		if(!_root::getRequest()->isPost() ){
    			return null;
    		}
     
    		$sLogin=_root::getParam('login');
    		$sPassword=_root::getParam('password');
     
    		if(strlen($sPassword > $this->maxPasswordLength)){
    			return 'Mot de passe trop long';
    		}
     
    		//on stoque les mots de passe hashe dans la classe model_user
    		$sHashPassword=model_user::getInstance()->hashPassword($sPassword);
    		$tAccount=model_user::getInstance()->getListAccount();
     
    		//on va verifier que l'on trouve dans le tableau retourne par notre model
    		//l'entree $tAccount[ login ][ mot de passe hashe ]
    		if(!_root::getAuth()->checkLoginPass($tAccount,$sLogin,$sHashPassword)){
    			return 'Mauvais login/mot de passe';
    		}
     
    		_root::redirect('default::index');
    	}


    on remplace la redirection classique default::index par cette variable
    ce qui donne

    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    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
     
     
    private function checkLoginPass(){
    		//si le formulaire n'est pas envoye on s'arrete la
    		if(!_root::getRequest()->isPost() ){
    			return null;
    		}
     
    		$sLogin=_root::getParam('login');
    		$sPassword=_root::getParam('password');
     
    		if(strlen($sPassword > $this->maxPasswordLength)){
    			return 'Mot de passe trop long';
    		}
     
    		//on stoque les mots de passe hashe dans la classe model_user
    		$sHashPassword=model_user::getInstance()->hashPassword($sPassword);
    		$tAccount=model_user::getInstance()->getListAccount();
     
    		//on va verifier que l'on trouve dans le tableau retourne par notre model
    		//l'entree $tAccount[ login ][ mot de passe hashe ]
    		if(!_root::getAuth()->checkLoginPass($tAccount,$sLogin,$sHashPassword)){
    			return 'Mauvais login/mot de passe';
    		}
     
                    if(isset($_SESSION['pageDemandee'])){
                      //on redirige vers la page au prealable enregistree
                      _root::redirect($_SESSION['pageDemandee']);
                    }else{
    		 _root::redirect('default::index');
                     }
    	}


    Vous voyez l'idée?

    Note:
    ajoutez pour la methode logout une suppression de la page enregistrée:
    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public function logout(){
    		$_SESSION['pageDemandee']=null;
    		$this->_disconnect();
    		_root::redirect('auth::login');
    	}
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  7. #7
    Nouveau membre du Club
    Ça marche au poil.

    Je suis surpris que cette question n'est pas été évoquée plus tôt. Les espaces publics/privés, c'est pourtant du classique.

    Mon précédent site sur mkframework était 100% privé, je n'avais pas le problème.

    Mais j'ai déjà, par ailleurs, réalisé plusieurs projets avec des espaces public/privé et l'utilisation du framework, une fois cette question élucidée, est un vrai plus.

    Ylian

  8. #8
    Rédacteur

    En effet, j'essaierai d'ajouter ce point dans les tutoriaux sur le site

    Je marque le sujet en résolu
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

###raw>template_hook.ano_emploi###