IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Zend_Acl & Zend_Auth PHP Discussion :

Authentification, Session et durée de vie de session [ZF 1.7]


Sujet :

Zend_Acl & Zend_Auth PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 77
    Points : 57
    Points
    57
    Par défaut Authentification, Session et durée de vie de session
    Bonjour à tous !
    Voila j'ai mis en place mon interface d'authentification sur l'application que je suis entrain de développez sous Zend, mais par la suite j'ai un soucis concernant tout ce qui se rapporte à la durée de vie d'une authentification et à l'utilisation de session (qui reste encore un peu confu pour moi après les différentes docs que j'ai pus trouver... namespace.. stockage des acl dans la session etc...).
    J'aimerais ainsi par exemple pouvoir déterminer une durée de vie d'une session d'utilisateur et ainsi conserver l'authentification d'un utilisateur pendant un certain temps ! J'ai parcouru le post [Zend_Auth] Durée de conservation de l'authentification et malgré ça j'y suis pas arrivé dans mon cas ..
    Je met mon code en espérant que quelqu'un puisse m'aider !!!

    Bootsrap :

    Code : 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    <?php
    /**
      * Bootstrap de l'application (Contrôleur Frontal)
      *
      */
     
    //Affichage des erreurs possibles détectées
    error_reporting(E_ALL);
     
    //Aucune limite d'exécution
    ini_set('max_execution_time',0);
     
    // Mise en place des répertoires et chargement des classes nécessaires
    set_include_path('.'
        . PATH_SEPARATOR . './library/'
    	.'.'
        . PATH_SEPARATOR . './application/models/'
        . PATH_SEPARATOR . get_include_path());
     
    // Utilisation de Zend_Loader
    require_once "Zend/Loader.php"; 
     
    // Chargement automatique des classe
    Zend_Loader::registerAutoload();
     
     
    // ******************** CONFIG ********************
     
    // Récupération des objets de configuration
    $configMain = new Zend_Config_Ini ( './application/config/configuration.ini', 'general' );
    $configSession = new Zend_Config_Ini ( './application/config/session.ini', 'prod' );
    $acl_ini = './application/config/acl.ini';
    $acl = new My_Acl_Ini($acl_ini);
    Zend_Registry::set ('config', $configMain );
     
     
    // ******************** SESSION ********************
     
    //Configuration de la Session
    Zend_Session::setOptions($configSession->toArray());
    Zend_Session::setOptions(array('save_path' => './application' .$configSession->save_path));
    Zend_Registry::set ('session', $session = new Zend_Session_Namespace($configSession->name));
     
     
    // ******************** DATE ********************
     
    date_default_timezone_set('Europe/Paris');
     
     
    // ******************** DATABASE ********************
     
    // Récupération de la base de données
    $db = Zend_Db::factory($configMain->db->adapter,  $configMain->db->config->toArray());
     
    //Passage de la connexion à toutes les classes passerelles
    Zend_Db_Table::setDefaultAdapter($db);
    $db->getConnection ()->exec ( "SET NAMES utf8" );
    $db->setFetchMode ( Zend_Db::FETCH_OBJ );
    Zend_Registry::set ( 'db', $db );
     
     
    // ********************** MVC **********************
     
    // Configuration du Controleur frontal
    $frontController = Zend_Controller_Front::getInstance();
    $frontController->throwExceptions(true);
    $frontController->setControllerDirectory('./application/controllers');
    $frontController->registerPlugin(new My_Controller_Plugin_Auth($acl)) ; 
     
    // ******************* LAYOUTS *******************
     
    Zend_Layout::startMvc('./application/layouts');
     
    // ******************* VIEW *******************
     
    $view = new Zend_View();
    $view->setEncoding('UTF-8');
    $view->doctype('XHTML1_TRANSITIONAL');
    Zend_Dojo::enableView($view);
     
    $view->dojo()
    	 ->addStyleSheetModule('dijit.themes.tundra')
    	 ->setLocalPath('../public/js/dojo/dojo.js')
    	 ->setDjConfigOption('usePlainJson',true)
    	 ->setDjConfigOption('parseOnLoad',true)
    	 ->enable(); 
     
    Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->setView($view);
     
     
     
    // ******************* DISPATCH *******************
     
    $frontController->dispatch();
    AuthController :

    Code : 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    <?php
    /**
     * Controller d'Authentification
    **/
     
    class AuthController extends Zend_Controller_Action
    {
     
    		//Initialisation
    	  	public function init()
        {
            $this->initView();
    		$this->view->baseUrl = $this->_request->getBaseUrl();
        }
     
    		//Action Index >> Redirection
    		public function indexAction()
        {
    	   $this->_redirect('/');
        }
     
    		//Action Login : Authentification de l'utilisateur
    		public function loginAction()
    	{
    			$this->view->message = '';
     
    			if ($this->_request->isPost()) {
     
    			//Collecte des données rentrées par l'utilisateur
    			$filter = new Zend_Filter_StripTags();
    			$login  = $filter->filter($this->_request->getPost('login'));
    			$pwd    = $filter->filter($this->_request->getPost('pwd'));
     
    			if (empty($login)) {
    			$this->view->message = 'Champ Utilisateur Manquant , Veuillez le remplir Svp !';
    				} else {
     
    			//Connexion à la table Users de la Base de donnée
    			$dbAdapter   = Zend_Registry::get('db');
    			$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
    			$authAdapter->setTableName('users');
    			$authAdapter->setIdentityColumn('login_user');
    			$authAdapter->setCredentialColumn('pwd_user');
    			$authAdapter->setCredentialTreatment("MD5(?)");
     
    			//Récupération des entrées pour réaliser l'authentification
    			$authAdapter->setIdentity($login);
    			$authAdapter->setCredential($pwd);
     
     
    			//Authentification
    			$auth   = Zend_Auth::getInstance();
    			$result = $auth->authenticate($authAdapter);
     
    			if ($result->isValid()) {
     
    			//Authentification Réussie : on stocke les informations de l'utilisateur sauf le mot de passe !
    			$data = $authAdapter->getResultRowObject(null, 'pwd_user');
    			$auth->getStorage()->write($data);
    			$this->_redirect('index');
     
    				} else {
     
    			//Authentification Echouée
    			$this->view->message = 'Echec Authentification (Utilisateur inconnu ou mot de passe incorrect) ! Veuillez Réessayer !';
     
    			}
    		}
    	}
    			$this->view->title = "Authentification";
    			$this->render();
    	}
     
    		//Action Logout : Déconnexion
    		public function logoutAction()
    	{
    		Zend_Auth::getInstance()->clearIdentity();
    		$this->_redirect('/');
    	}
     
    }
    Plugin d'authentification (afin d'éviter tous les predispatch dans les controllers) :

    Code : 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    <?php
    /**
     * Plugin d'Authentification
    **/
     
    class My_Controller_Plugin_Auth extends Zend_Controller_Plugin_Abstract	{
    	/**
    	 * @var Zend_Auth instance 
    	 */
    	private $_auth;
     
    	/**
    	 * @var Zend_Acl instance 
    	 */
    	private $_acl;
     
    	/**
    	 * Chemin de redirection lors de l'échec d'authentification
    	 */
    	const FAIL_AUTH_MODULE     = 'default';
    	const FAIL_AUTH_ACTION     = 'login';
    	const FAIL_AUTH_CONTROLLER = 'auth';
     
    	/**
    	 * Chemin de redirection lors de l'échec de contrôle des privilèges
    	 */
    	const FAIL_ACL_MODULE     = 'default';
    	const FAIL_ACL_ACTION     = 'privileges';
    	const FAIL_ACL_CONTROLLER = 'error';
     
    	/**
    	 * Constructeur
    	 */
    	public function __construct(Zend_Acl $acl)	{
    		$this->_acl  = $acl ;
    		$this->_auth = Zend_Auth::getInstance() ;
    	}
     
    	/**
    	 * Vérifie les autorisations
    	 * Utilise _request et _response hérités et injectés par le FC
    	 */
    	public function preDispatch(Zend_Controller_Request_Abstract $request)	{
     
    		//Si l'utilisateur est authentifié
    		if ($this->_auth->hasIdentity()) {
     
    		  //On récupère sont rôle
    		  $user = $this->_auth->getStorage()->read();
    		  $role = $user->role_user;
    		} else {
    		  //Sinon c'est un simple visiteur
    		  $role = 'Visiteur';
    		}
     
    		$module 	= $request->getModuleName() ;
    		$controller = $request->getControllerName() ;
    		$action     = $request->getActionName() ;
     
    		$front = Zend_Controller_Front::getInstance() ;
    		$default = $front->getDefaultModule() ;
     
    		//Compose le nom de la ressource
    		if ($module == $default)	{
    			$resource = $controller ;
    		} else {
    			$resource = $module.'_'.$controller ;
    		}
     
    		//On vérifie si la ressource existe
    		if (!$this->_acl->has($resource)) {
    		  $resource = null;
    		}
     
    		//On vérifie si l'utilisateur à les droits d'accès à la ressource
    		if (!$this->_acl->isAllowed($role, $resource, $action)) {
    			//Si l'utilisateur n'à pa les droits sur la ressource, on le redirige
    			if (!$this->_auth->hasIdentity()) {
    				//S'il n'est pas identifié (rôle = Guest) redirection vers la page d'authentification
    				$module = self::FAIL_AUTH_MODULE ;
    				$controller = self::FAIL_AUTH_CONTROLLER ;
    				$action = self::FAIL_AUTH_ACTION ;
    			} else {
    				//Si il est identifié, c'est un erreur de privilèges, de droits
    				$module = self::FAIL_ACL_MODULE ;
    				$controller = self::FAIL_ACL_CONTROLLER ;
    				$action = self::FAIL_ACL_ACTION ;
    			}
    		}
    		$request->setModuleName($module) ;
    		$request->setControllerName($controller) ;
    		$request->setActionName($action) ;
    	}
    }
    Classe de création des ACL (a partir d'un fichier INI)

    Code : 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    <?php
    /**
     * Classe de création des ACL via un fichier de configuration INI
    **/
     
    class My_Acl_Ini extends Zend_Acl	{
    	public function __construct($file)	{
    		$roles = new Zend_Config_Ini($file, 'roles') ;
    		$this->_setRoles($roles) ;
     
    		$ressources = new Zend_Config_Ini($file, 'ressources') ;
    		$this->_setRessources($ressources) ;
     
    		foreach ($roles->toArray() as $role => $parents)	{
    			$privileges = new Zend_Config_Ini($file, $role) ;
    			$this->_setPrivileges($role, $privileges) ;
    		}
    	}
     
    	protected function _setRoles($roles)	{
    		foreach ($roles as $role => $parents)	{
    			if (empty($parents))	{
    				$parents = null ;
    			} else {
    				$parents = explode(',', $parents) ;
    			}
     
    			$this->addRole(new Zend_Acl_Role($role), $parents);
    		}
     
    		return $this ;
    	}
     
    	protected function _setRessources($ressources)	{
    		foreach ($ressources as $ressource => $parents)	{
    			if (empty($parents))	{
    				$parents = null ;
    			} else {
    				$parents = explode(',', $parents) ;
    			}
     
    			$this->add(new Zend_Acl_Resource($ressource), $parents);
    		}
     
    		return $this ;
    	}
     
    	protected function _setPrivileges($role, $privileges)	{
    		foreach ($privileges as $do => $ressources)	{
    			foreach ($ressources as $ressource => $actions)	{
    				if (empty($actions))	{
    					$actions = null ;
    				} else {
    					$actions = explode(',', $actions) ;
    				}
     
    				$this->{$do}($role, $ressource, $actions);
    			}
    		}
     
    		return $this ;
    	}
    }
    Session.ini :

    Code : 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
    [prod]
    ; bug_compat_42
    ; bug_compat_warn
    ; cache_expire
    ; cache_limiter
    ; cookie_domain
    ; cookie_lifetime
    ; cookie_path
    ; cookie_secure
    ; entropy_file
    ; entropy_length
    ; hash_bits_per_character
    ; hash_function
    ; referer_check
    ; save_handler
    ; serialize_handler
     
    use_cookies = on
    use_only_cookies = on
    ;use_trans_sid = off
    remember_me_seconds = 0
    name = gestpresent_session
    ;gc_divisor = 10
    ;gc_maxlifetime = 86400
    ;gc_probability = 1
    save_path = /temp

  2. #2
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    salut,
    voici qlq étapes à suivre pour fixée la durée de vie de session :
    1/créer une classe zend_Auth_Storage_TimedSession c'est une classe fille de zend_Auth_Storage_Session
    dans cette classe vous crée un champ $_duration initialise par la méthode "setDurationSeconds($seconds)"
    et après vous surcharger la méthode Read() et dans cette méthode vous relancer le compteur de la durée de session
    Code : 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
     
    <?php
    require_once 'Zend/Auth/Storage/Session.php';
     
    require_once 'Zend/Session.php';
    class Zend_Auth_Storage_TimedSession extends Zend_Auth_Storage_Session
    {
     protected $_duration;
     public function setDurationSeconds($sec)
     {
       $this->_duration = $sec;
       $this->_session->setExpirationSeconds($this->_duration);
     }
     public function read()
     {
       if (isset($this->_duration)) {
         $this->_session->setExpirationSeconds($this->_duration);
       }
       return parent::read();
     }
    }
    ?>
    2/dans le votre bootstrap vous instancie cette classe "zend_Auth_Storage_TimedSession" et stocke cet objet dans le registre pour pouvoir y accéder à partir de tes contrôleurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $storage=new Zend_Auth_Storage_TimedSession()
    $storage->setDurationSeconds(1800)//nombre de seconds
    $auth=Zend_Auth::getInstance();
    $auth->setStorage($storage);
    zend_Registry::set('auth',$auth);
    3/dans le predispatch() de tes contrôleurs vous le redirige vers la page login
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function preDispatche(){
    $auth=Zend_Registry::get('auth');
    if(!auth->hasIdentity(){
    $this->_redirect('login');
    }
    }
    bonne chance

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 77
    Points : 57
    Points
    57
    Par défaut
    J'ai pu m'en sortir pour la durée de vie de l'authentification ! Merci ghamrired !! c'est un peu ce qui il y avait déja dans le post [Zend_Auth] Durée de conservation de l'authentification .. après plusieurs relecture j'ai compris le fonctionnement !
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.2] Durée de vie des sessions
    Par mic79 dans le forum Langage
    Réponses: 4
    Dernier message: 13/01/2010, 16h36
  2. Durée de vie de session
    Par bsidy1 dans le forum Langage
    Réponses: 1
    Dernier message: 21/01/2009, 10h50
  3. durée de vie de session silverlight
    Par tchitchimon dans le forum Silverlight
    Réponses: 5
    Dernier message: 25/08/2008, 15h52
  4. Durée de vie des sessions et fermeture du navigateur
    Par taffMan dans le forum Langage
    Réponses: 2
    Dernier message: 24/01/2008, 11h05
  5. Durée de vie des sessions
    Par naevaj dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 09/05/2007, 18h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo