Commit a74f7710d523c50b9537bad5e4296abd6ed4e6fe
1 parent
aaeefcef
Exists in
master
and in
1 other branch
NOUVELLE PAGE AFFICHANT LES AUTORISATIONS DYNAMIQUEMENT (v3.7.9.30)
=> /pages/acls ou /pages/acls/#nom_du_controleur => On peut ainsi vérifier ce qui est appliqué à l'instant T (juste après la modif d'une règle par exemple)
Showing
7 changed files
with
211 additions
and
40 deletions
Show diff stats
README.md
... | ... | @@ -54,19 +54,12 @@ Logiciel testé et validé sur les configurations suivantes : |
54 | 54 | VERSION ACTUELLE |
55 | 55 | |
56 | 56 | Date: 03/06/2020 |
57 | -Version: 3.7.9.29 | |
57 | +Version: 3.7.9.30 | |
58 | 58 | Author: EP |
59 | 59 | Commentaire: |
60 | - - NOUVEAU SYSTEME D'AUTORISATION DES ACTIONS => CENTRALISÉ et testé OK | |
61 | - => TOUS les tests passent sauf certains qui ne passent plus car les nouvelles conditions sont plus strictes | |
62 | - (ils ont été temporairement désactivés en attendant réécriture plus générique qui viendra très vite) | |
63 | - => On peut voir dynamiquement l'état actuel des autorisations via la page web "/autorisations" | |
64 | - => Autorisations définies dans chaque controleur par setAuthorizations() qui initialise un tableau UNIQUE de AppController ($this->is_authorized_action) | |
65 | - => La méthode isAuthorized() de chaque controleur appelle isAuthorizedAction() (de AppController) qui autorise ou pas l'action en fonction de ce tableau unique | |
66 | - => Quand on veut changer une autorisation, il suffit de le faire UNE SEULE FOIS dans la méthode setAuthorizations() | |
67 | - Cette autorisation sera alors prise en compte PARTOUT dans le code (code des actions, des vues, etc...) | |
68 | - => L'initialisation des autorisations est faite (par la méthode setAuthorizationForAction() de AppController) dans un format standard, | |
69 | - quelque soit l'autorisation, donc c'est très LISIBLE et facile à modifier | |
60 | + - NOUVELLE PAGE AFFICHANT LES AUTORISATIONS DYNAMIQUEMENT (/pages/acls ou /pages/acls/#nom_du_controleur) | |
61 | + => On peut ainsi vérifier ce qui est appliqué à l'instant T (juste après la modif d'une règle par exemple) | |
62 | + | |
70 | 63 | - ajout de 2 très gros tests génériques pour les actions et les vues matos/index et matos/view en cours... (ce qui m'évitera plein de tests à la main) |
71 | 64 | |
72 | 65 | - Renforcement tests suivis et emprunts (materiel validated only) et refactorisations |
... | ... | @@ -115,6 +108,17 @@ La liste ci-dessous est aussi en ligne ici : https://tinyurl.com/labinvent#headi |
115 | 108 | |
116 | 109 | ----------------------------------------------------------------------------------------------------------- |
117 | 110 | |
111 | +03/06/2020 v3.7.9.29 (EP) | |
112 | + - NOUVEAU SYSTEME D'AUTORISATION DES ACTIONS => CENTRALISÉ et testé OK | |
113 | + => TOUS les tests passent sauf certains qui ne passent plus car les nouvelles conditions sont plus strictes | |
114 | + (ils ont été temporairement désactivés en attendant réécriture plus générique qui viendra très vite) | |
115 | + => Autorisations définies dans chaque controleur par setAuthorizations() qui initialise un tableau UNIQUE de AppController ($this->is_authorized_action) | |
116 | + => La méthode isAuthorized() de chaque controleur appelle isAuthorizedAction() (de AppController) qui autorise ou pas l'action en fonction de ce tableau unique | |
117 | + => Quand on veut changer une autorisation, il suffit de le faire UNE SEULE FOIS dans la méthode setAuthorizations() | |
118 | + Cette autorisation sera alors prise en compte PARTOUT dans le code (code des actions, des vues, etc...) | |
119 | + => L'initialisation des autorisations est faite (par la méthode setAuthorizationForAction() de AppController) dans un format standard, | |
120 | + quelque soit l'autorisation, donc c'est très LISIBLE et facile à modifier | |
121 | + | |
118 | 122 | 15/05/2020 v3.7.9.28 (EP) |
119 | 123 | - Renforcement tests suivis et emprunts (materiel validated only) et refactorisations |
120 | 124 | - ajout de 2 très gros tests qui tuent des vues matos/index et matos/view en cours... (ce qui m'évitera plein de tests à la main) | ... | ... |
src/Controller/AppController.php
... | ... | @@ -199,7 +199,7 @@ class AppController extends Controller |
199 | 199 | |
200 | 200 | // (OLD AVIRER) EP 08/2017 |
201 | 201 | // protected $easyACL = array( |
202 | - const easyACL = array( | |
202 | + const OLD_easyACL = array( | |
203 | 203 | |
204 | 204 | /** |
205 | 205 | * Default ACL for ALL (logged) users |
... | ... | @@ -428,6 +428,13 @@ class AppController extends Controller |
428 | 428 | } |
429 | 429 | |
430 | 430 | } // setAuthorizationForAction |
431 | + | |
432 | + | |
433 | + public function getAuthorizations($action=null, $role=null) { | |
434 | + if (!$action) return $this->is_authorized_action; | |
435 | + if (!$role) return $this->is_authorized_action[$action]; | |
436 | + return $this->is_authorized_action[$action][$role]; | |
437 | + } | |
431 | 438 | |
432 | 439 | /* |
433 | 440 | * Retourne le materiel associé à l'entité courante |
... | ... | @@ -715,7 +722,7 @@ class AppController extends Controller |
715 | 722 | |
716 | 723 | |
717 | 724 | // if (isset($this->easyACL['DEFAULT'][$action])) { |
718 | - public function hasACLRule($easyACL, $role, $action) | |
725 | + public function OLD_hasACLRule($easyACL, $role, $action) | |
719 | 726 | { |
720 | 727 | // return isset($this->easyACL[$role][$action]); |
721 | 728 | // return (null !== self::easyACL[$role][$action]); |
... | ... | @@ -735,7 +742,7 @@ class AppController extends Controller |
735 | 742 | * return strpos($haystack, $needle, strlen($haystack)-1) === 0; |
736 | 743 | * } |
737 | 744 | */ |
738 | - public function evalACL($condition) | |
745 | + public function OLD_evalACL($condition) | |
739 | 746 | { |
740 | 747 | return $condition; |
741 | 748 | // Simple case |
... | ... | @@ -748,18 +755,18 @@ class AppController extends Controller |
748 | 755 | return true; |
749 | 756 | } |
750 | 757 | |
751 | - public function evalSpecificRule($condition, AppController $controller, $user, $role, $action, $id = null) | |
758 | + public function OLD_evalSpecificRule($condition, AppController $controller, $user, $role, $action, $id = null) | |
752 | 759 | { |
753 | 760 | // if starts with "&&" eval DEFAULT rule && specific rule |
754 | 761 | if ($this->startsWith($condition, '&&')) { |
755 | 762 | //debug($condition); |
756 | 763 | //if (! isset($controller::easyACL['DEFAULT'][$action])) return new \Exception('bad rule'); |
757 | - if (! array_key_exists($action, $controller::easyACL['DEFAULT']) ) return new \Exception('bad rule'); | |
764 | + if (! array_key_exists($action, $controller::OLD_easyACL['DEFAULT']) ) return new \Exception('bad rule'); | |
758 | 765 | //return $this->evalACL($controller->easyACL['DEFAULT'][$action]) && $this->evalACL($condition); |
759 | - return $this->evalACL($controller::easyACL['DEFAULT'][$action]).' ' . $this->evalACL($condition); | |
766 | + return $this->OLD_evalACL($controller::OLD_easyACL['DEFAULT'][$action]).' ' . $this->OLD_evalACL($condition); | |
760 | 767 | } |
761 | 768 | // otherwise, eval only specific rule |
762 | - return $this->evalACL($condition); | |
769 | + return $this->OLD_evalACL($condition); | |
763 | 770 | } |
764 | 771 | |
765 | 772 | public function isAuthorizedByAcl($acl) { |
... | ... | @@ -816,35 +823,35 @@ class AppController extends Controller |
816 | 823 | |
817 | 824 | // 1) SPECIFIC controller SPECIFIC (role) rule for action |
818 | 825 | // if (isset($controller->easyACL[$role][$action])) { |
819 | - if (self::hasACLRule($controller::easyACL, $role, $action)) { | |
826 | + if (self::OLD_hasACLRule($controller::OLD_easyACL, $role, $action)) { | |
820 | 827 | if ($doDEBUG) |
821 | 828 | debug("CAS1"); |
822 | - return $this->evalSpecificRule($controller::easyACL[$role][$action], $controller, $user, $role, $action); | |
829 | + return $this->OLD_evalSpecificRule($controller::OLD_easyACL[$role][$action], $controller, $user, $role, $action); | |
823 | 830 | } |
824 | 831 | |
825 | 832 | // 2) SPECIFIC controller DEFAULT rule for action |
826 | 833 | // if (null !== $controller::easyACL['DEFAULT'][$action]) { |
827 | - if (self::hasACLRule($controller::easyACL, 'DEFAULT', $action)) { | |
834 | + if (self::OLD_hasACLRule($controller::OLD_easyACL, 'DEFAULT', $action)) { | |
828 | 835 | if ($doDEBUG) |
829 | 836 | debug("CAS2"); |
830 | - return $this->evalACL($controller::easyACL['DEFAULT'][$action]); | |
837 | + return $this->OLD_evalACL($controller::OLD_easyACL['DEFAULT'][$action]); | |
831 | 838 | } |
832 | 839 | |
833 | 840 | // 3) ALL controllers (AppController) SPECIFIC (role) rule for action |
834 | 841 | // if (isset($this->easyACL[$role][$action])) { |
835 | - if (self::hasACLRule(self::easyACL, $role, $action)) { | |
842 | + if (self::OLD_hasACLRule(self::OLD_easyACL, $role, $action)) { | |
836 | 843 | if ($doDEBUG) |
837 | 844 | debug("CAS3"); |
838 | - return $this->evalSpecificRule(self::easyACL[$role][$action], $this, $user, $role, $action); | |
845 | + return $this->OLD_evalSpecificRule(self::OLD_easyACL[$role][$action], $this, $user, $role, $action); | |
839 | 846 | } |
840 | 847 | |
841 | 848 | // 4) ALL controllers (AppController) DEFAULT rule for action |
842 | 849 | // if (isset($this->easyACL['DEFAULT'][$action])) { |
843 | 850 | // if (self::hasACLRule('DEFAULT',$action)) { |
844 | - if (self::hasACLRule(self::easyACL, 'DEFAULT', $action)) { | |
851 | + if (self::OLD_hasACLRule(self::OLD_easyACL, 'DEFAULT', $action)) { | |
845 | 852 | if ($doDEBUG) |
846 | 853 | debug("CAS4"); |
847 | - return $this->evalACL(self::easyACL['DEFAULT'][$action]); | |
854 | + return $this->OLD_evalACL(self::OLD_easyACL['DEFAULT'][$action]); | |
848 | 855 | // return $this->evalACL(parent::getACLRule('DEFAULT',$action)); |
849 | 856 | } |
850 | 857 | ... | ... |
src/Controller/EmpruntsController.php
... | ... | @@ -122,7 +122,7 @@ class EmpruntsController extends AppController |
122 | 122 | // Action 'edit' (modif d'une entité) => comme pour 'add' |
123 | 123 | $this->setAuthorizationForAction('delete', 'add', [ |
124 | 124 | //'super' => ['default',0] |
125 | - 'super' => ['edit'] | |
125 | + 'super' => 'edit' | |
126 | 126 | ]); |
127 | 127 | |
128 | 128 | } // setAuthorizations | ... | ... |
src/Controller/MaterielsController.php
... | ... | @@ -52,7 +52,7 @@ class MaterielsController extends AppController { |
52 | 52 | |
53 | 53 | // EP 08/2017 |
54 | 54 | // protected $easyACL = array( |
55 | - const easyACL = array( | |
55 | + const OLD_easyACL = array( | |
56 | 56 | |
57 | 57 | /** |
58 | 58 | * Default ACL for ALL (logged) users |
... | ... | @@ -270,10 +270,12 @@ class MaterielsController extends AppController { |
270 | 270 | //'resp' => [0,0], |
271 | 271 | ]); |
272 | 272 | */ |
273 | + | |
273 | 274 | // Action 'add' (ajout d'un nouveau matériel par copie d'un autre) |
274 | 275 | $this->setAuthorizationForAction('add_by_copy', ['CREATED',0], [ |
275 | 276 | 'user' => ['CREATED',1], |
276 | - 'resp' => ['CREATED',0], | |
277 | + //'resp' => ['CREATED',0], | |
278 | + 'resp' => 'default', | |
277 | 279 | //$admin = 'default', |
278 | 280 | //$super = 'default' |
279 | 281 | ]); | ... | ... |
src/Controller/SuivisController.php
... | ... | @@ -30,7 +30,8 @@ class SuivisController extends AppController |
30 | 30 | |
31 | 31 | // Action 'edit' (modif d'une entité) => comme pour 'add' |
32 | 32 | $this->setAuthorizationForAction('delete', 'add', [ |
33 | - 'super' => ['default',0] | |
33 | + //'super' => ['default',0] | |
34 | + 'super' => 'edit' | |
34 | 35 | ]); |
35 | 36 | |
36 | 37 | // Action 'getNextDate' | ... | ... |
src/Template/Pages/acls.ctp
1 | -<div class="index"> | |
1 | +<?php | |
2 | + | |
3 | +use App\Controller\MaterielsController; | |
4 | +use App\Controller\SuivisController; | |
5 | +use App\Controller\EmpruntsController; | |
6 | +use App\Controller\DocumentsController; | |
7 | +use App\Controller\UsersController; | |
8 | +use App\Controller\ConfigurationsController; | |
9 | +use App\Controller\FournisseursController; | |
10 | + | |
11 | + | |
12 | +function displayAuthorizationsForController($c) { | |
13 | + | |
14 | + ?> | |
15 | + <a id="<?=$c->name?>"> | |
16 | + <u><b>Autorisations pour le contrôleur des <?=$c->name?> :</b></u> | |
17 | + </a> | |
18 | + <br><br> | |
19 | + | |
20 | + <table border=1> | |
21 | + <tr> | |
22 | + <th></th> | |
23 | + <th colspan="2">GÉNÉRAL<br>(règles par défaut)</th> | |
24 | + <th colspan="2">Utilisateur<br>(profil)</th> | |
25 | + <th colspan="2">Responsable<br>(profil)</th> | |
26 | + <th colspan="2">Administratif<br>(profil Gestionnaire)</th> | |
27 | + <th colspan="2">Super Administrateur<br>(profil)</th> | |
28 | + </tr> | |
29 | + <tr> | |
30 | + <th>ACTION</th> | |
31 | + <th colspan="2">Condition d'accès<br>(Statut & Appartenance<br>du matériel)</th> | |
32 | + <th colspan="2">Condition d'accès<br>(Statut & Appartenance<br>du matériel)</th> | |
33 | + <th colspan="2">Condition d'accès<br>(Statut & Appartenance<br>du matériel)</th> | |
34 | + <th colspan="2">Condition d'accès<br>(Statut & Appartenance<br>du matériel)</th> | |
35 | + <th colspan="2">Condition d'accès<br>(Statut & Appartenance<br>du matériel)</th> | |
36 | + </tr> | |
37 | + | |
38 | + <?php | |
39 | + $authorizations = $c->getAuthorizations(); | |
40 | + foreach (array_keys($authorizations) as $action) { | |
41 | + ?> | |
42 | + <!-- Autorisations pour chaque action ($a) --> | |
43 | + <tr> | |
44 | + | |
45 | + <td><?=$action?></td> | |
46 | + <?php | |
47 | + $authorizationsForCurrentAction = $authorizations[$action]; | |
48 | + foreach (array_keys($authorizationsForCurrentAction) as $role) { | |
49 | + // Autorisations pour chaque role ($role) | |
50 | + // On zappe le role "admin plus" | |
51 | + if ($role == 'adminp') continue; | |
52 | + $authorizationsForCurrentActionAndRole = $authorizationsForCurrentAction[$role]; | |
53 | + if (! is_array($authorizationsForCurrentActionAndRole)) { | |
54 | + $color='black'; | |
55 | + if ($authorizationsForCurrentActionAndRole === 'default' || $authorizationsForCurrentActionAndRole === 0) { | |
56 | + //$authorizationsForCurrentActionAndRole = 'règle générale'; | |
57 | + $authorizationsForCurrentActionAndRole = 'aucune'; | |
58 | + $color='green'; | |
59 | + } | |
60 | + elseif ($authorizationsForCurrentActionAndRole === -1) { | |
61 | + $authorizationsForCurrentActionAndRole = 'interdit'; | |
62 | + $color='red'; | |
63 | + } | |
64 | + ?> | |
65 | + <td colspan="2" style="color:<?=$color?>"><?=$authorizationsForCurrentActionAndRole?></td> | |
66 | + <?php | |
67 | + } | |
68 | + else { | |
69 | + $condition_status = $authorizationsForCurrentActionAndRole[0]; | |
70 | + $condition_belonging = $authorizationsForCurrentActionAndRole[1]; | |
71 | + //if ($c->name == 'Emprunts') debug("$condition_status $condition_belonging"); | |
72 | + $condition_belonging = $condition_belonging===0 ? 'N' : 'Y'; | |
73 | + ?> | |
74 | + <td><?=$condition_status?></td> | |
75 | + <td><?=$condition_belonging?></td> | |
76 | + <?php | |
77 | + } | |
78 | + } | |
79 | + ?> | |
80 | + </tr> | |
81 | + <!-- Autorisations pour l'action $a --> | |
82 | + | |
83 | + <?php | |
84 | + } | |
85 | + ?> | |
86 | + | |
87 | + </table> | |
88 | + | |
89 | +<?php | |
90 | +} // displayAuthorizationsForController | |
91 | + | |
92 | + | |
93 | +//$controllers = ['Materiels']; | |
94 | +//$controllers = ['Materiels', 'Suivis']; | |
95 | +$controllers = [ | |
96 | + new MaterielsController(), | |
97 | + new SuivisController(), | |
98 | + new EmpruntsController(), | |
99 | + new DocumentsController(), | |
100 | + | |
101 | + // TODO: | |
102 | + //new UsersController(), | |
103 | + //new ConfigurationsController(), | |
104 | + //new FournisseursController(), | |
105 | + // ... | |
106 | +]; | |
107 | + | |
108 | +?> | |
109 | + | |
110 | + | |
111 | + | |
112 | + | |
113 | + | |
114 | + | |
2 | 115 | <h2> |
3 | - <i class="icon-print"></i> AUTORISATIONS | |
116 | + <!-- | |
117 | + <i class="icon-print"></i> | |
118 | + --> | |
119 | + AUTORISATIONS DES UTILISATEURS (droits en fonction des profils) | |
4 | 120 | </h2> |
5 | 121 | |
122 | + <!-- | |
6 | 123 | <br /> |
7 | 124 | <br /> |
8 | 125 | <h3>AUTORISATIONS DES UTILISATEURS (PROFILS)</h3> |
9 | - <hr /> | |
126 | + --> | |
10 | 127 | |
11 | 128 | <br /> |
12 | 129 | <p> |
... | ... | @@ -14,15 +131,55 @@ |
14 | 131 | <a href="https://projects.irap.omp.eu/projects/inventirap/wiki/Installation#I-Etiquettes-optionnel"> |
15 | 132 | --> |
16 | 133 | <!-- new lien GDOC --> |
17 | - => | |
18 | - <a href="https://docs.google.com/document/d/1JTi3YX6X33asn9vfPGAPaFZ3u8IMGnAqCf2Ge0nWdtI/edit#heading=h.jaa6i3mtbmnr"> | |
19 | - Lien vers ce chapitre dans la documentation technique | |
134 | + => <a href="https://docs.google.com/spreadsheets/d/16uAq_ko6bpKGxRZTL9rWq5XZ6kaVGMqowLURpBBdJJU"> | |
135 | + Lien vers le tableau des autorisations (fait à la main, donc pas forcément à jour) | |
136 | + </a> | |
137 | + <br> | |
138 | + => <a href="https://docs.google.com/document/d/1JTi3YX6X33asn9vfPGAPaFZ3u8IMGnAqCf2Ge0nWdtI/edit#heading=h.jaa6i3mtbmnr"> | |
139 | + Lien vers le chapitre sur les Autorisations dans la documentation technique | |
20 | 140 | </a> |
21 | 141 | </p> |
22 | -</div> | |
142 | + <hr /> | |
143 | + | |
144 | + <?php | |
145 | + echo '<u>'; | |
146 | + foreach ($controllers as $controller) { | |
147 | + echo "<li><a href='#{$controller->name}'>{$controller->name}</a></li>"; | |
148 | + //echo '<br>'; | |
149 | + } | |
150 | + echo '</u>'; | |
151 | + ?> | |
152 | + <hr /> | |
153 | + | |
154 | + | |
155 | +<?php | |
156 | + | |
157 | +//var_dump($mc->getAuthorizationForAction('edit')); | |
158 | +foreach ($controllers as $controller) { | |
159 | + //$mc = new MaterielsController(); | |
160 | + /* | |
161 | + $controller_name = 'MaterielsController'; | |
162 | + $controller = new $controller_name (); | |
163 | + $controller_name = $c.'Controller'; | |
164 | + $controller = (new $controller_name()); | |
165 | + */ | |
166 | + echo '<br>'; | |
167 | + displayAuthorizationsForController($controller); | |
168 | + echo '<br>'; | |
169 | + echo "<a href='#'>Haut de page</a>"; | |
170 | + echo '<hr />'; | |
171 | +} | |
172 | + | |
173 | +?> | |
174 | + | |
23 | 175 | |
24 | -<?php | |
25 | 176 | |
177 | + | |
178 | + | |
179 | + | |
180 | + | |
181 | + | |
182 | +<?php | |
26 | 183 | /* ANCIENNE PAGE WEB |
27 | 184 | |
28 | 185 | ... | ... |
tests/TestCase/Controller/MaterielsControllerTest.php
... | ... | @@ -610,10 +610,10 @@ class MaterielsControllerTest extends General { |
610 | 610 | */ |
611 | 611 | //private function _testMatCreateAs($role, $materiel=null) { $this->testMat31CreateAs($role, $materiel); } |
612 | 612 | public function testMat31CreateAs($role, $materiel=null) { |
613 | - debug("************* in testMat31CreateAs(role, matos) avec role $role"); | |
613 | + //debug("************* in testMat31CreateAs(role, matos) avec role $role"); | |
614 | 614 | //$materiel = $materiel ? $this->newMaterielWithAllMandatoryFields : $materiel; |
615 | 615 | if (is_null($materiel)) $materiel = $this->newMaterielWithAllMandatoryFields; |
616 | - debug($materiel); | |
616 | + //debug($materiel); | |
617 | 617 | //$this->setUp(); |
618 | 618 | // On doit pouvoir accéder à la page une fois authentifié |
619 | 619 | $this->authAs($role); | ... | ... |