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