Commit a74f7710d523c50b9537bad5e4296abd6ed4e6fe

Authored by Etienne Pallier
1 parent aaeefcef
Exists in master and in 1 other branch dev

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)
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 &amp; Appartenance<br>du matériel)</th>
  32 + <th colspan="2">Condition d'accès<br>(Statut &amp; Appartenance<br>du matériel)</th>
  33 + <th colspan="2">Condition d'accès<br>(Statut &amp; Appartenance<br>du matériel)</th>
  34 + <th colspan="2">Condition d'accès<br>(Statut &amp; Appartenance<br>du matériel)</th>
  35 + <th colspan="2">Condition d'accès<br>(Statut &amp; 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);
... ...