Bonjour,
Comme je suis en train d'apprendre Zend et que je ne connais pas encore toute l'étendu du MVC je voulais savoir si je pars dans le bon sens avec mon authentification et ma répartition des rôles via l'Acl dans mon application, ce qui m'interesse c'est surtout la sécurité mais aussi la façon la plus efficace possible pour écrire du PHP5 via le framework :
//Voici mon bootstrap
//Mon LoginController
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 <?php class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { protected function _initViewHelper() { $this->bootstrap('view'); $view = $this->getResource('view'); $view->setEncoding('UTF-8'); $view->doctype('HTML5'); $view->headTitle('Search Events'); $view->headTitle()->setSeparator(' - '); $view->headLink()->appendStylesheet('/css/themes/colorpaper/style.css') ->appendStylesheet('/css/themes/colorpaper/reset-min.css'); } protected function _initAutoload() { $moduleLoader = new Zend_Application_Module_Autoloader(array( 'namespace' => '', 'basePath' => APPLICATION_PATH)); $front = Zend_Controller_Front::getInstance(); $front->registerPlugin(new My_Acl_plugin()); return $moduleLoader; } protected function _initZendAcl() { //Définition des rôles $ZendAcl = new Zend_Acl(); //On défini les 4 rôles du site qui de base hérite tous des droits de guest $ZendAcl->addRole(new Zend_Acl_Role('guest')) ->addRole(new Zend_Acl_Role('member'),'guest') ->addRole(new Zend_Acl_Role('partner'),'guest') ->addRole(new Zend_Acl_Role('admin'),'guest'); //On définis les ressources $ZendAcl->addResource(new Zend_Acl_Resource('artists')) ->addResource(new Zend_Acl_Resource('events')) ->addResource(new Zend_Acl_Resource('index')) ->addResource(new Zend_Acl_Resource('login')) ->addResource(new Zend_Acl_Resource('partners')) ->addResource(new Zend_Acl_Resource('places')) ->addResource(new Zend_Acl_Resource('styles')) ->addResource(new Zend_Acl_Resource('users')); //on définit les ressources attribués aux roles //Guest $ZendAcl->allow('guest', 'index','index') ->allow('guest', 'index','concept') ->allow('guest', 'index','rss') ->allow('guest', 'index','contact') ->allow('guest', 'login','index') ->allow('guest', 'login','logout') ->allow('guest', 'users','ajouter') ->allow('guest', 'users','success') ->allow('guest', 'users','validate'); //Member $ZendAcl->allow('member', 'login','account'); //Partner $ZendAcl->allow('partner', 'login','accountPartner'); //Admin $ZendAcl->allow('admin', 'login','accountAdmin'); return $ZendAcl; } }
//My/Acl/Plugin.php
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137 <?php class LoginController extends Zend_Controller_Action { public function init() { } public function indexAction() { $userInfos = Zend_Auth::getInstance()->getIdentity(); if($userInfos){ $logged = $this->_loggedInAs($userInfos->TYPE_UTILISATEUR); $this->view->login = $logged; }else{ $this->_log(); } } private function _log() { $formLogin = new Form_Login(); $this->view->login = $formLogin; if($this->getRequest()->isPost()){ $formDataLogin = $this->getRequest()->getPost(); if(isset($formDataLogin['form']) && $formDataLogin['form']==='formLog'){ if ($formLogin->isValid($formDataLogin)){ if($this->_process($formLogin->getValues())){ $users = new Model_DbTable_Users(); $rowUsers = $users->obtenirStatutTypeUser($formDataLogin['emailLog']); if($rowUsers['STATUT_UTILISATEUR']==1){ //if($users->obtenirStatutTypeUser($formDataLogin['emailLog'])==1){ $logged = $this->_loggedInAs($rowUsers['TYPE_UTILISATEUR']); $this->view->login = $logged; }else{ //a améliorer (l'afficher déja caché dans le frm) $passwordElement = $formLogin->getElement('passwordLog'); $passwordElement->addDecorator(new My_Form_Decorator_Html(array('html' => "<div class='spacer'></div><div class='errorLog'>Votre compte est inactif (lien vue explication)</div>",'placement' => 'append'))); } }else{ //a améliorer (l'afficher déja caché dans le frm) $passwordElement = $formLogin->getElement('passwordLog'); $passwordElement->addDecorator(new My_Form_Decorator_Html(array('html' => "<div class='spacer'></div><div class='errorLog'>Email ou mot de passe incorrecte</div>",'placement' => 'append'))); } } } } } protected function _process($values) { $adapter = $this->_getAuthAdapter(); $adapter->setIdentity($values['emailLog']); $adapter->setCredential($values['passwordLog']); $auth = Zend_Auth::getInstance(); $result = $auth->authenticate($adapter); if ($result->isValid()){ $user = $adapter->getResultRowObject(); $auth->getStorage()->write($user); return true; } return false; } protected function _getAuthAdapter() { $dbAdapter = Zend_Db_Table::getDefaultAdapter(); $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter); $authAdapter->setTableName('utilisateur') ->setIdentityColumn('EMAIL_UTILISATEUR') ->setCredentialColumn('MDP_UTILISATEUR') ->setCredentialTreatment('SHA1(MD5(CONCAT(?)))'); return $authAdapter; } private function _loggedInAs($typeUser) { $auth = Zend_Auth::getInstance(); if ($auth->hasIdentity()) { switch ($typeUser) { //user account case 1: $accountUrl = $this->view->url(array('controller'=>'login','action'=>'account'), null, true); break; //partenaire account case 2: $accountUrl = $this->view->url(array('controller'=>'login','action'=>'accountPartner'), null, true); break; break; //admin account case 3: $accountUrl = $this->view->url(array('controller'=>'login','action'=>'accountAdmin'), null, true); break; } $pseudo = $auth->getIdentity()->PSEUDO_UTILISATEUR; $logoutUrl = $this->view->url(array('controller'=>'login','action'=>'logout'), null, true); $contentLog = 'Bienvenue <span class="loggedPseudo">' . $pseudo . '</span>'; $contentLog .= '<a href="'.$accountUrl.'" class="classicButton spaceLeft" title="Mon compte">Mon compte</a><br />'; $contentLog .= '<a href="'.$logoutUrl.'" class="classicButton" title="Déconnexion">Déconnexion</a>'; return $contentLog; } } public function logoutAction() { Zend_Auth::getInstance()->clearIdentity(); $this->_redirect('/'); } public function accountAction() { $userInfos = Zend_Auth::getInstance()->getIdentity(); if($userInfos->TYPE_UTILISATEUR==1){ } } public function accountPartnerAction() { $userInfos = Zend_Auth::getInstance()->getIdentity(); if($userInfos->TYPE_UTILISATEUR==2){ } } public function accountAdminAction() { $userInfos = Zend_Auth::getInstance()->getIdentity(); if($userInfos->TYPE_UTILISATEUR==3){ } } }
J'aimerais savoir si il était possible également de faire des sous dossiers dans les ressources de vue, du style :
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 <?php class My_Acl_Plugin extends Zend_Controller_Plugin_Abstract { public function preDispatch(Zend_Controller_Request_Abstract $request) { $role = 'guest'; if(Zend_Auth::getInstance()->hasIdentity()){ switch (Zend_Auth::getInstance()->getIdentity()->TYPE_UTILISATEUR) { //user rôle case 1: $role = 'member'; break; //partenaire rôle case 2: $role = 'partner'; break; break; //admin rôle case 3: $role = 'admin'; break; } } $controller = $request->controller; $action = $request->action; $resource = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('ZendAcl')->has($controller) ? $controller : null; if (!Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('ZendAcl')->isAllowed($role, $resource, $action)) { $request->setControllerName('Error'); $request->setActionName('deny'); } } } ?>
index/guest/
index/member/
index/admin/
En vous remerçiant.
Partager