Commit 02b7f0bea25e60a9da81eb4983b9e927f020c9bb
1 parent
02692f05
Exists in
master
and in
1 other branch
Diverses améliorations, simplifications, optimisations
- Ajout de $this->entity, $this->action et $this->action_id (...) dans beforeFilter() pour simplifier et optimiser la suite des traitements - simplification du isAuthorizedAction() de Materiels - Optimisations pour éviter trop de requetes en BD et simplification des tests acl - Meilleure gestion des aspects authentification et authorization - mon 1er View Helper dans src/View/Helper (MyButtonHelper) pour créer plus facilement des boutons !! : - migration des fonctions getActionButton() et displayElement() dans MyButtonHelper et remplacement progressif dans les vues
Showing
13 changed files
with
622 additions
and
456 deletions
Show diff stats
README.md
... | ... | @@ -55,13 +55,15 @@ VERSION ACTUELLE |
55 | 55 | |
56 | 56 | |
57 | 57 | |
58 | -Date: 24/04/2020 | |
59 | -Version: 3.7.9.20 | |
58 | +Date: 28/04/2020 | |
59 | +Version: 3.7.9.21 | |
60 | 60 | Author: EP |
61 | 61 | Commentaire: |
62 | - Améliorations diverses : | |
63 | - - Meilleure gestion des aspects authentification et authorization (car je comprends mieux maintenant) | |
64 | - - PagesController maintenant bien plus clean | |
62 | + Diverses améliorations, simplifications, optimisations : | |
63 | + - Ajout de $this->entity, $this->action et $this->action_id (...) dans beforeFilter() pour simplifier et optimiser la suite des traitements | |
64 | + - simplification du isAuthorizedAction() de Materiels | |
65 | + - Optimisations pour éviter trop de requetes en BD et simplification des tests acl | |
66 | + - Meilleure gestion des aspects authentification et authorization | |
65 | 67 | - mon 1er View Helper dans src/View/Helper (MyButtonHelper) pour créer plus facilement des boutons !! : |
66 | 68 | - migration des fonctions getActionButton() et displayElement() dans MyButtonHelper et remplacement progressif dans les vues |
67 | 69 | |
... | ... | @@ -98,6 +100,13 @@ La liste ci-dessous n'est plus à jour, elle est désormais en ligne ici : https |
98 | 100 | |
99 | 101 | ----------------------------------------------------------------------------------------------------------- |
100 | 102 | |
103 | +24/04/2020 Version 3.7.9.20 (EP) | |
104 | + Améliorations diverses : | |
105 | + - Meilleure gestion des aspects authentification et authorization (car je comprends mieux maintenant) | |
106 | + - PagesController maintenant bien plus clean | |
107 | + - mon 1er View Helper dans src/View/Helper (MyButtonHelper) pour créer plus facilement des boutons !! : | |
108 | + - migration des fonctions getActionButton() et displayElement() dans MyButtonHelper et remplacement progressif dans les vues | |
109 | + | |
101 | 110 | 20/04/2020 Version 3.7.9.19 (EP) |
102 | 111 | Améliorations EMPRUNT... : |
103 | 112 | - Améliorations EMPRUNT | ... | ... |
src/Controller/AppController.php
... | ... | @@ -359,104 +359,50 @@ class AppController extends Controller |
359 | 359 | return (int) $this->request->getParam('pass.0'); |
360 | 360 | } |
361 | 361 | |
362 | - /** | |
363 | - * Initialization hook method. | |
364 | - * Use this method to add common initialization code like loading components. | |
365 | - * e.g. `$this->loadComponent('Security');` | |
366 | - * | |
367 | - * @return void | |
362 | + /* (EP 20200428) | |
363 | + * | |
364 | + * Méthode pour optimiser les accès à la BD. | |
365 | + * Retourne l'entité concernée par l'action. | |
366 | + * | |
367 | + * Cette méthode ne doit être appelée que lorsque c'est approprié | |
368 | + * (actions 'edit', 'view', ..., mais pas 'add', 'find', 'index', ...) | |
369 | + * sinon ça provoque une exception... | |
370 | + * | |
371 | + * Optimisation : l'entité n'est récupérée dans la BD qu'une seule fois pour toutes | |
372 | + * | |
368 | 373 | */ |
369 | - public function initialize() | |
370 | - { | |
371 | - $this->myDebug("step 0B (general): AppController.initialize()"); | |
372 | - | |
373 | - parent::initialize(); | |
374 | - | |
375 | - $this->loadComponent('RequestHandler'); | |
376 | - $this->loadComponent('Flash'); | |
377 | - | |
378 | - // Composant en charge de l'authentification | |
379 | - | |
380 | - // - sans LDAP : | |
374 | + protected function getEntity($id=null) { | |
375 | + // Si pas d'id => exception (stop) | |
376 | + //assert($this->action_id>0); | |
377 | + if (!$this->action_id && !$id) throw new \Exception(__("cette methode doit etre appelée avec un id déjà positionné !!!")); | |
378 | + | |
379 | + // Si l'entité actuellement en mémoire n'est pas la bonne, la mettre à null pour obliger à la recharger | |
380 | + if ($id && $this->entity && $this->entity->id != $id) $this->entity = null; | |
381 | + | |
382 | + // Les 3 sont possibles | |
383 | + //$model = $this->request->getParam('controller'); // ex: Materiels | |
384 | + //$model = $this->name; // ex: Materiels | |
385 | + $model = $this->modelClass; // ex: Materiels | |
386 | + | |
381 | 387 | /* |
382 | - $this->loadComponent('Auth', [ | |
383 | - 'authenticate' => [ | |
384 | - 'Form' => [ | |
385 | - 'fields' => [ | |
386 | - 'username' => 'email', | |
387 | - 'password' => 'password' | |
388 | - ] | |
389 | - ] | |
390 | - ], | |
391 | - 'loginAction' => [ | |
392 | - 'controller' => 'Users', | |
393 | - 'action' => 'login' | |
394 | - ], | |
395 | - // If unauthorized, return them to page they were just on | |
396 | - 'unauthorizedRedirect' => $this->referer() | |
397 | - ]); | |
398 | - // Allow the display action so our PagesController | |
399 | - // continues to work. Also enable the read only actions. | |
400 | - $this->Auth->allow(['display', 'view', 'index']); | |
401 | - // Les autres actions sont redirigées sur /users/login | |
388 | + debug("model2"); | |
389 | + $model = $this->$model; | |
390 | + debug($model); | |
402 | 391 | */ |
403 | - | |
404 | - // - avec LDAP : | |
405 | - /* | |
406 | - * If none of your users have hashed passwords, comment this block and $this->Auth->allow() calls. | |
407 | - * (par exemple dans beforeFilter()) | |
408 | - * Then go and edit the user, saving a new password for them. | |
409 | - * After saving a new password for the user, | |
410 | - * make sure to uncomment the lines we just temporarily commented! | |
411 | - */ | |
412 | - $this->loadComponent('LdapAuth', [ | |
413 | - // Les AUTHORIZATIONS sont faites par Controleur | |
414 | - // (et non pas par un Component ou plugin) | |
415 | - // TODO: utiliser Authorization component plugin (cakephp v4) | |
416 | - //'authorize'=> 'Controller', | |
417 | - 'authorize' => ['Controller'], | |
418 | - /* | |
419 | - 'authenticate' => [ | |
420 | - 'Form' => [ | |
421 | - 'fields' => [ | |
422 | - 'username' => 'email', | |
423 | - 'password' => 'password' | |
424 | - ] | |
425 | - ] | |
426 | - ], | |
427 | - */ | |
428 | - 'loginRedirect' => [ | |
429 | - 'controller' => 'Pages', | |
430 | - //'action' => 'home' | |
431 | - 'action' => 'display', | |
432 | - 'home' | |
433 | - ], | |
434 | - 'logoutRedirect' => [ | |
435 | - 'controller' => 'Pages', | |
436 | - 'action' => 'home' | |
437 | - ] | |
438 | - ]); | |
439 | - // Actions autorisées SANS authentification | |
440 | - // Allow the display action so our PagesController continues to work. | |
441 | - // Also enable the read only actions. | |
442 | - // Déplacé dans beforeFilter() | |
443 | - //$this->LdapAuth->allow(['display', 'view', 'index']); | |
444 | - // Autoriser TOUTES les actions SANS authentification : | |
445 | - //$this->LdapAuth->allow(); | |
446 | - | |
447 | - // On charge la configuration | |
392 | + | |
393 | + //ex: if (! $this->entity) $this->entity = $this->Materiels->get($this->action_id); | |
394 | + if (! $this->entity) $this->entity = $this->$model->get($this->action_id); | |
448 | 395 | /* |
449 | - $this->confLabinvent = TableRegistry::getTableLocator()->get('Configurations')->find() | |
450 | - ->where([ | |
451 | - 'id =' => 1 | |
452 | - ]) | |
453 | - ->first(); | |
396 | + * Avec les entités associées : | |
397 | + if (! $this->entity) $this->entity = $this->$model->get($this->action_id, [ | |
398 | + 'contain' => ['Comments'] | |
399 | + ]); | |
454 | 400 | */ |
455 | - $this->confLabinvent = TableRegistry::getTableLocator()->get('Configurations')->find()->first(); | |
456 | - // (EP 23/5/19) Exception si la config est vide, inutile d'aller plus loin ! | |
457 | - if (is_null($this->confLabinvent)) throw new \Exception("EXCEPTION: La table 'configurations' de la base de données est vide"); | |
401 | + //debug($this->entity); | |
402 | + return $this->entity; | |
458 | 403 | } |
459 | 404 | |
405 | + | |
460 | 406 | /** |
461 | 407 | * (EP) |
462 | 408 | * Autorisations PAR DÉFAUT |
... | ... | @@ -472,19 +418,16 @@ class AppController extends Controller |
472 | 418 | |
473 | 419 | // $role = $this->getUserRole($user); |
474 | 420 | |
475 | - // Seul Administration (et +) peut ajouter, supprimer ou modifier | |
476 | - if (in_array($action, ['add', 'edit', 'delete'])) { | |
421 | + // Seul Administration (et +) peut ajouter, supprimer ou modifier (pour la plupart des controleurs) | |
422 | + if (in_array($action, ['add', 'edit', 'delete'])) | |
477 | 423 | return ($this->USER_IS_ADMIN_AT_LEAST()); |
478 | 424 | /* |
479 | 425 | if ($this->USER_IS_ADMIN_AT_LEAST()) return true; |
480 | 426 | // Les autres n'y ont pas accès |
481 | 427 | return false; |
482 | 428 | */ |
483 | - } | |
484 | - | |
485 | - // By default | |
486 | - // return parent::isAuthorized($user); | |
487 | 429 | |
430 | + // Sinon, on applique les règles générales par défaut | |
488 | 431 | // Ne pas faire ça car $this sera interprété comme le controleur SPECIFIQUE et non AppController : |
489 | 432 | //return $this->isAuthorized($user); |
490 | 433 | // Donc, il faut être explicite : |
... | ... | @@ -498,16 +441,22 @@ class AppController extends Controller |
498 | 441 | * Check whether a LOGGED in user has a set of permissions to perform a given action |
499 | 442 | * Give authorization in general |
500 | 443 | * |
501 | - * Autorisations APRES connexion | |
502 | - * (AVANT, c'est initialize() et beforeFilter() qui s'en occupent) | |
444 | + * Autorisations APRES connexion, donc à partir d'ici le user est obligatoirement identifié | |
445 | + * (AVANT connexion, c'est initialize() et beforeFilter() qui gèrent) | |
503 | 446 | * |
504 | 447 | * On tente d’autoriser ici les actions qui n’ont pas été autorisées |
505 | 448 | * par la méthode isAuthorized du controleur spécifique |
506 | 449 | * |
450 | + * ref: https://book.cakephp.org/4/fr/controllers/components/authentication.html#autorisation | |
451 | + * | |
452 | + * $user est l'equivalent de $this->LdapAuth->user() | |
453 | + * | |
507 | 454 | */ |
508 | 455 | public function isAuthorized($user) |
509 | 456 | { |
510 | 457 | $this->myDebug("step 2C (general): AppController.isAuthorized()"); |
458 | + | |
459 | + // $user est l'equivalent de $this->LdapAuth->user() | |
511 | 460 | $this->myDebug("- user is:", $user); |
512 | 461 | |
513 | 462 | /* |
... | ... | @@ -517,39 +466,54 @@ class AppController extends Controller |
517 | 466 | * return true; |
518 | 467 | * } |
519 | 468 | */ |
520 | - $configuration = $this->confLabinvent; | |
521 | - $role = $this->getUserRole($user); | |
469 | + //$configuration = $this->confLabinvent; | |
470 | + //$role = $this->getUserRole($user); | |
471 | + | |
522 | 472 | /* |
523 | 473 | * $role = TableRegistry::getTableLocator()->get('Users')->find() |
524 | 474 | * ->where(['username' => $user[$configuration->authentificationType_ldap][0]]) |
525 | 475 | * ->first()['role']; |
526 | 476 | */ |
527 | - $this->myDebug("- role is " . $role); | |
477 | + $this->myDebug("- role is " . $this->userRole); | |
478 | + | |
479 | + /* | |
480 | + $prefix = $this->request->getParam('prefix'); | |
481 | + $this->myDebug("- prefix is $prefix"); | |
482 | + */ | |
528 | 483 | |
529 | 484 | // BETTER: |
530 | 485 | // $action = $this->request->getAttribute('params')['action']; |
531 | 486 | // $action = $this->request->getParam('action'); |
532 | - $action = $this->getActionPassed(); | |
487 | + //$action = $this->getActionPassed(); | |
533 | 488 | |
534 | 489 | // error_log($action); |
535 | - $this->myDebug("- action is $action"); | |
536 | - | |
490 | + //$this->myDebug("- action is $action"); | |
491 | + $this->myDebug("- action is $this->action"); | |
492 | + | |
537 | 493 | // On autorise ou pas l’action demandée : |
538 | 494 | // - Super-Admin peut accéder à toutes les actions |
539 | - if ($role == 'Super Administrateur') return true; | |
540 | - // - Actions accessibles à TOUS les roles (profils), quelque soit le controleur | |
541 | - if (in_array($action, [ | |
495 | + //if ($role == 'Super Administrateur') return true; | |
496 | + if ($this->USER_IS_SUPERADMIN) return true; | |
497 | + // - Actions générales accessibles à TOUS les roles (profils), pour TOUT controleur | |
498 | + if (in_array($this->action, [ | |
542 | 499 | 'index', |
543 | 500 | 'view', |
544 | 501 | 'add', |
545 | 502 | 'find', |
503 | + /* (EP sale ! => migré dans chaque controleur spécifique concerné) | |
504 | + // QrCode | |
546 | 505 | 'creer', |
506 | + // Suivis | |
547 | 507 | 'getNextDate', |
508 | + // Materiels | |
548 | 509 | 'getDateGarantie' |
510 | + */ | |
549 | 511 | ])) return true; |
550 | - // - Pour toutes les autres actions => accès refusé (denied) | |
512 | + | |
513 | + // - Pour toutes les autres actions, par défaut => accès refusé (denied) | |
551 | 514 | return false; |
552 | - } | |
515 | + | |
516 | + } // isAuthorized() | |
553 | 517 | |
554 | 518 | |
555 | 519 | // (EP) Used by Materiels and Users Controllers |
... | ... | @@ -663,6 +627,127 @@ class AppController extends Controller |
663 | 627 | return $this->userHasRole('Utilisateur'); |
664 | 628 | } |
665 | 629 | |
630 | + | |
631 | + | |
632 | + /** | |
633 | + * Initialization hook method. | |
634 | + * Use this method to add common initialization code like loading components. | |
635 | + * e.g. `$this->loadComponent('Security');` | |
636 | + * | |
637 | + * ref: https://book.cakephp.org/4/fr/controllers/components/authentication.html#id1 | |
638 | + * ref: https://book.cakephp.org/4/fr/controllers/components/authentication.html#configuration-des-gestionnaires-d-authentification | |
639 | + * | |
640 | + * @return void | |
641 | + */ | |
642 | + public function initialize() | |
643 | + { | |
644 | + $this->myDebug("step 0B (general): AppController.initialize()"); | |
645 | + | |
646 | + parent::initialize(); | |
647 | + | |
648 | + $this->loadComponent('RequestHandler'); | |
649 | + $this->loadComponent('Flash'); | |
650 | + | |
651 | + // Composant en charge de l'authentification | |
652 | + | |
653 | + // - sans LDAP : | |
654 | + /* | |
655 | + $this->loadComponent('Auth', [ | |
656 | + 'authenticate' => [ | |
657 | + 'Form' => [ | |
658 | + 'fields' => [ | |
659 | + 'username' => 'email', | |
660 | + 'password' => 'password' | |
661 | + ] | |
662 | + ] | |
663 | + // avec finder redéfini | |
664 | + 'Form' => [ | |
665 | + 'finder' => 'auth' // va utiliser une méthode findAuth() dans UsersTable | |
666 | + ] | |
667 | + ], | |
668 | + 'loginAction' => [ | |
669 | + 'controller' => 'Users', | |
670 | + 'action' => 'login' | |
671 | + ], | |
672 | + // If unauthorized, return them to page they were just on | |
673 | + 'unauthorizedRedirect' => $this->referer() | |
674 | + ]); | |
675 | + // Allow the display action so our PagesController | |
676 | + // continues to work. Also enable the read only actions. | |
677 | + $this->Auth->allow(['display', 'view', 'index']); | |
678 | + // Les autres actions sont redirigées sur /users/login | |
679 | + */ | |
680 | + | |
681 | + // - avec LDAP : | |
682 | + /* | |
683 | + * If none of your users have hashed passwords, comment this block and $this->Auth->allow() calls. | |
684 | + * (par exemple dans beforeFilter()) | |
685 | + * Then go and edit the user, saving a new password for them. | |
686 | + * After saving a new password for the user, | |
687 | + * make sure to uncomment the lines we just temporarily commented! | |
688 | + */ | |
689 | + $this->loadComponent('LdapAuth', [ | |
690 | + // Les AUTHORIZATIONS sont faites par Controleur | |
691 | + // (et non pas par un Component ou plugin) | |
692 | + // TODO: utiliser Authorization component plugin (cakephp v4) | |
693 | + //'authorize'=> 'Controller', | |
694 | + 'authorize' => ['Controller'], | |
695 | + /* pour Auth (au lieu de LdapAuth) on aurait aussi mis ceci : | |
696 | + 'authenticate' => [ | |
697 | + 'Form' => [ | |
698 | + 'fields' => [ | |
699 | + 'userna100000000000000000000000000000000me' => 'email', | |
700 | + 'password' => 'password' | |
701 | + ] | |
702 | + ] | |
703 | + ], | |
704 | + */ | |
705 | + // Redirection après login : | |
706 | + 'loginRedirect' => [ | |
707 | + 'controller' => 'Pages', | |
708 | + //'action' => 'home' | |
709 | + 'action' => 'display', | |
710 | + 'home' | |
711 | + ], | |
712 | + // Redirection après logout : | |
713 | + 'logoutRedirect' => [ | |
714 | + 'controller' => 'Pages', | |
715 | + 'action' => 'home' | |
716 | + ] | |
717 | + ]); | |
718 | + // On peut aussi configurer après : | |
719 | + // Message d'erreur en cas de refus de connexion | |
720 | + $this->LdapAuth->setConfig('authError', "Désolé, vous n'êtes pas autorisé à accéder à cette zone."); | |
721 | + /* Autres possibilités de config : | |
722 | + * $this->Auth->config('authenticate', [ | |
723 | + * 'Form' => ['userModel' => 'Members'] | |
724 | + * //'Basic' => ['userModel' => 'Members'], | |
725 | + * ]); | |
726 | + * $this->Auth->config('authorize', ['Controller']); | |
727 | + */ | |
728 | + // Actions autorisées SANS authentification | |
729 | + // Allow the display action so our PagesController continues to work. | |
730 | + // Also enable the read only actions. | |
731 | + // Déplacé dans beforeFilter() | |
732 | + //$this->LdapAuth->allow(['display', 'view', 'index']); | |
733 | + // Autoriser TOUTES les actions SANS authentification : | |
734 | + //$this->LdapAuth->allow(); | |
735 | + | |
736 | + // On charge la configuration | |
737 | + /* | |
738 | + $this->confLabinvent = TableRegistry::getTableLocator()->get('Configurations')->find() | |
739 | + ->where([ | |
740 | + 'id =' => 1 | |
741 | + ]) | |
742 | + ->first(); | |
743 | + */ | |
744 | + $this->confLabinvent = TableRegistry::getTableLocator()->get('Configurations')->find()->first(); | |
745 | + // (EP 23/5/19) Exception si la config est vide, inutile d'aller plus loin ! | |
746 | + if (is_null($this->confLabinvent)) throw new \Exception("EXCEPTION: La table 'configurations' de la base de données est vide"); | |
747 | + | |
748 | + } // initialize() | |
749 | + | |
750 | + | |
666 | 751 | /** |
667 | 752 | * |
668 | 753 | * {@inheritdoc} |
... | ... | @@ -679,19 +764,28 @@ class AppController extends Controller |
679 | 764 | */ |
680 | 765 | public function beforeFilter(Event $event) { |
681 | 766 | // Affichages pour debug |
767 | + //pr($event); | |
682 | 768 | $this->myDebug("step 1B (general): AppController.beforeFilter()"); |
683 | 769 | $controllerName = $this->request->getParam('controller'); |
684 | 770 | $this->myDebug("- controller passed : $controllerName"); |
685 | - $this->myDebug("- action passed : ".$this->getActionPassed()); | |
686 | 771 | $passedArgs = $this->request->getParam('pass'); |
687 | 772 | $this->myDebug("- args passed : ", $passedArgs); |
688 | 773 | $query = $this->request->getQueryParams(); |
689 | 774 | $this->myDebug("- query passed : ", $query); |
690 | - //pr($event); | |
691 | - | |
692 | - // !!! Ne jamais autoriser l'action 'login', sinon cela va créer des problèmes sur le fonctionnement normal de AuthComponent (cf doc) !!! | |
775 | + | |
776 | + // Initialisations pour la suite | |
777 | + // - L'entité concernée par l'action | |
778 | + // Par défaut null car certaines actions n'ont pas d'entité (ex : 'add', 'find', 'index', ...) | |
779 | + $this->entity = null; | |
780 | + // - L'action demandée et son id le cas échéant (nul par défaut, égal 0) | |
781 | + $this->action = $this->getActionPassed(); | |
782 | + $this->myDebug("- action passed : ".$this->action); | |
783 | + $this->action_id = $this->getIdPassed(); | |
784 | + $this->myDebug("- id passed : ".$this->action); | |
785 | + | |
693 | 786 | parent::beforeFilter($event); |
694 | 787 | |
788 | + // !!! Ne jamais autoriser l'action 'login', sinon cela va créer des problèmes sur le fonctionnement normal de AuthComponent (cf doc) !!! | |
695 | 789 | /* |
696 | 790 | * EXEMPLES d'utilisation: |
697 | 791 | * // to allow all access to all actions: |
... | ... | @@ -713,72 +807,75 @@ class AppController extends Controller |
713 | 807 | // TODO: (EP) A quoi ça sert ??? |
714 | 808 | $this->request->getSession()->write("authType", $configuration->ldap_authenticationType); |
715 | 809 | |
716 | - // ATTENTION, $priviledgedUser = NULL si l'utilisateur courant n'est pas un utilisateur privilégié | |
717 | - // (c'est à dire s'il n'est pas dans la table "utilisateurs") | |
718 | - $this->priviledgedUser = $this->getTablePriviledgedUserFromCurrentSessionUserIfExists(); | |
719 | - //$role = $this->getUserRole(); | |
720 | - $this->userRole = $this->getUserRole(); | |
721 | - $profile = self::PROFILES["$this->userRole"]; | |
722 | - $this->myDebug("- userRole is {$this->getUserRole()}", "- profile is: $profile"); | |
723 | - | |
724 | - // Set General CONSTANTS for all CONTROLLERS | |
725 | - // (Before, they used to be in beforeFilter()) | |
726 | - // - Users constants | |
727 | - $this->userName = $this->LdapAuth->user('sn')[0] . ' ' . $this->LdapAuth->user('givenname')[0]; | |
728 | - //$this->set('username', $this->LdapAuth->user('sn')[0] . ' ' . $this->LdapAuth->user('givenname')[0]); | |
729 | - | |
730 | - $this->USER_IS_UTILISATEUR = ($profile == self::PROFILE_USER); | |
731 | - $this->USER_IS_RESPONSABLE = ($profile == self::PROFILE_RESPONSABLE); | |
732 | - $this->USER_IS_ADMIN = ($profile == self::PROFILE_ADMIN); | |
733 | - $this->USER_IS_ADMINPLUS = ($profile == self::PROFILE_ADMINPLUS); | |
734 | - $this->USER_IS_SUPERADMIN = ($profile == self::PROFILE_SUPERADMIN); | |
735 | - | |
736 | - $this->USER_IS_RESPONSABLE_OR_MORE = ($profile >= self::PROFILE_RESPONSABLE); | |
737 | - $this->USER_IS_ADMIN_OR_MORE = ($profile >= self::PROFILE_ADMIN); | |
738 | - $this->USER_IS_ADMINPLUS_OR_MORE = ($profile >= self::PROFILE_ADMINPLUS); | |
739 | - | |
740 | - | |
741 | - // - Misc constants | |
742 | - $this->idGmNa = TableRegistry::getTableLocator()->get('GroupesMetiers')->find() | |
743 | - ->where([ | |
744 | - 'nom =' => 'N/A' | |
745 | - ]) | |
746 | - ->first()['id']; | |
747 | - $this->idGtNa = TableRegistry::getTableLocator()->get('GroupesThematiques')->find() | |
748 | - ->where([ | |
749 | - 'nom =' => 'N/A' | |
750 | - ]) | |
751 | - ->first()['id']; | |
810 | + // Groupes métier et technique | |
811 | + // id du Groupe métier N/A | |
812 | + $this->idGmNa = TableRegistry::getTableLocator()->get('GroupesMetiers') | |
813 | + ->find()->where(['nom =' => 'N/A'])->first()['id']; | |
814 | + // id du Groupe technique N/A | |
815 | + $this->idGtNa = TableRegistry::getTableLocator()->get('GroupesThematiques') | |
816 | + ->find()->where(['nom =' => 'N/A'])->first()['id']; | |
817 | + | |
818 | + // Utilisateur connecté (identifié) ? | |
819 | + $this->myDebug("- Utilisateur connecté ? : ", $this->LdapAuth->user() ? "oui" : "non"); | |
820 | + $this->myDebug($this->LdapAuth->user()); | |
821 | + // Si le user est connecté (identifié), on positionne quelques variables utiles | |
822 | + // - pour le controleur spécifique, | |
823 | + // - et pour la vue | |
824 | + if ($this->LdapAuth->user()) { | |
825 | + // ATTENTION, $priviledgedUser = NULL si l'utilisateur courant n'est pas un utilisateur privilégié | |
826 | + // (c'est à dire s'il n'est pas dans la table "utilisateurs") | |
827 | + $this->priviledgedUser = $this->getTablePriviledgedUserFromCurrentSessionUserIfExists(); | |
828 | + //$role = $this->getUserRole(); | |
829 | + $this->userRole = $this->getUserRole(); | |
830 | + $profile = self::PROFILES["$this->userRole"]; | |
831 | + $this->myDebug("- priviledgedUser is {$this->priviledgedUser}"); | |
832 | + $this->myDebug("- userRole is {$this->getUserRole()}", "- profile is: $profile"); | |
833 | + // L'utilisateur connecté (return null si pas connecté) | |
834 | + // $this->Auth->user('id'); | |
835 | + $this->userName = $this->LdapAuth->user('sn')[0] . ' ' . $this->LdapAuth->user('givenname')[0]; | |
836 | + //$this->set('username', $this->LdapAuth->user('sn')[0] . ' ' . $this->LdapAuth->user('givenname')[0]); | |
837 | + $this->USER_IS_UTILISATEUR = ($profile == self::PROFILE_USER); | |
838 | + $this->USER_IS_RESPONSABLE = ($profile == self::PROFILE_RESPONSABLE); | |
839 | + $this->USER_IS_ADMIN = ($profile == self::PROFILE_ADMIN); | |
840 | + $this->USER_IS_ADMINPLUS = ($profile == self::PROFILE_ADMINPLUS); | |
841 | + $this->USER_IS_SUPERADMIN = ($profile == self::PROFILE_SUPERADMIN); | |
842 | + | |
843 | + $this->USER_IS_RESPONSABLE_OR_MORE = ($profile >= self::PROFILE_RESPONSABLE); | |
844 | + $this->USER_IS_ADMIN_OR_MORE = ($profile >= self::PROFILE_ADMIN); | |
845 | + $this->USER_IS_ADMINPLUS_OR_MORE = ($profile >= self::PROFILE_ADMINPLUS); | |
846 | + | |
847 | + // Positionne ces variables pour TOUTES les vues | |
848 | + $this->set('role', $this->userRole); | |
849 | + $this->set('profile', $profile); | |
850 | + $this->set('username', $this->userName); | |
851 | + $this->set('priviledgedUser', $this->priviledgedUser); | |
852 | + | |
853 | + $this->set('USER_IS_UTILISATEUR', $this->USER_IS_UTILISATEUR); | |
854 | + $this->set('USER_IS_ADMIN', $this->USER_IS_ADMIN); | |
855 | + $this->set('USER_IS_ADMINPLUS', $this->USER_IS_ADMINPLUS); | |
856 | + $this->set('USER_IS_SUPERADMIN', $this->USER_IS_SUPERADMIN); | |
857 | + $this->set('USER_IS_RESPONSABLE_OR_MORE', $this->USER_IS_RESPONSABLE_OR_MORE); | |
858 | + $this->set('USER_IS_RESPONSABLE', $this->USER_IS_RESPONSABLE); | |
859 | + //$this->set(compact('USER_IS_ADMIN_OR_MORE')); | |
860 | + $this->set('USER_IS_ADMIN_OR_MORE', $this->USER_IS_ADMIN_OR_MORE); | |
861 | + $this->set('USER_IS_ADMINPLUS_OR_MORE', $this->USER_IS_ADMINPLUS_OR_MORE); | |
862 | + | |
863 | + // (EP) TODO: vraiment utile ??? A virer, non ? | |
864 | + $this->set('PROFILE_USER', self::PROFILE_USER); | |
865 | + $this->set('PROFILE_ADMIN', self::PROFILE_ADMIN); | |
866 | + $this->set('PROFILE_RESPONSABLE', self::PROFILE_RESPONSABLE); | |
867 | + $this->set('PROFILE_ADMINPLUS', self::PROFILE_ADMINPLUS); | |
868 | + $this->set('PROFILE_SUPERADMIN', self::PROFILE_SUPERADMIN); | |
869 | + // $this->set('allProfiles', $this->allProfiles); | |
870 | + $this->set('allProfiles', self::PROFILES); | |
871 | + } | |
752 | 872 | |
753 | 873 | // Now, set these constants for all VIEWS |
754 | - | |
755 | 874 | $this->set(compact('configuration')); |
756 | 875 | $this->set(compact('D')); |
757 | 876 | |
758 | - $this->set('role', $this->userRole); | |
759 | - $this->set('profile', $profile); | |
760 | - $this->set('username', $this->userName); | |
761 | - $this->set('priviledgedUser', $this->priviledgedUser); | |
762 | 877 | $this->set('idGmNa', $this->idGmNa); |
763 | 878 | $this->set('idGtNa', $this->idGtNa); |
764 | - $this->set('USER_IS_UTILISATEUR', $this->USER_IS_UTILISATEUR); | |
765 | - $this->set('USER_IS_ADMIN', $this->USER_IS_ADMIN); | |
766 | - $this->set('USER_IS_ADMINPLUS', $this->USER_IS_ADMINPLUS); | |
767 | - $this->set('USER_IS_SUPERADMIN', $this->USER_IS_SUPERADMIN); | |
768 | - $this->set('USER_IS_RESPONSABLE_OR_MORE', $this->USER_IS_RESPONSABLE_OR_MORE); | |
769 | - $this->set('USER_IS_RESPONSABLE', $this->USER_IS_RESPONSABLE); | |
770 | - //$this->set(compact('USER_IS_ADMIN_OR_MORE')); | |
771 | - $this->set('USER_IS_ADMIN_OR_MORE', $this->USER_IS_ADMIN_OR_MORE); | |
772 | - $this->set('USER_IS_ADMINPLUS_OR_MORE', $this->USER_IS_ADMINPLUS_OR_MORE); | |
773 | - | |
774 | - // (EP) TODO: vraiment utile ??? A virer, non ? | |
775 | - $this->set('PROFILE_USER', self::PROFILE_USER); | |
776 | - $this->set('PROFILE_ADMIN', self::PROFILE_ADMIN); | |
777 | - $this->set('PROFILE_RESPONSABLE', self::PROFILE_RESPONSABLE); | |
778 | - $this->set('PROFILE_ADMINPLUS', self::PROFILE_ADMINPLUS); | |
779 | - $this->set('PROFILE_SUPERADMIN', self::PROFILE_SUPERADMIN); | |
780 | - // $this->set('allProfiles', $this->allProfiles); | |
781 | - $this->set('allProfiles', self::PROFILES); | |
782 | 879 | |
783 | 880 | // On autorise certaines actions SANS connexion (ces actions sont donc publiques) |
784 | 881 | // - pour le mode spécial “installation” => on autorise pleins d’actions sans login |
... | ... | @@ -796,11 +893,12 @@ class AppController extends Controller |
796 | 893 | // Autoriser TOUTES les actions SANS authentification |
797 | 894 | //$this->LdapAuth->allow(); |
798 | 895 | |
799 | - $allowed_actions = $this->LdapAuth->allowedActions; | |
800 | - $this->myDebug("- Actions allowed are: ", $allowed_actions); | |
896 | + $this->myDebug("- Actions allowed are: ", $this->LdapAuth->allowedActions); | |
801 | 897 | |
898 | + /* (EP 20200427 migré dans initialize()) | |
899 | + // Message d'erreur en cas de refus de connexion | |
802 | 900 | $this->LdapAuth->setConfig('authError', "Désolé, vous n'êtes pas autorisé à accéder à cette zone."); |
803 | - //exit; | |
901 | + */ | |
804 | 902 | |
805 | 903 | } // beforeFilter() |
806 | 904 | |
... | ... | @@ -914,25 +1012,25 @@ class AppController extends Controller |
914 | 1012 | /* |
915 | 1013 | * @todo EP 08/2017 Nouvelle organisation des ACL avec $easyACL |
916 | 1014 | */ |
917 | - $action = $this->getActionPassed(); | |
918 | - if (in_array($action, array( | |
1015 | + //$action = $this->getActionPassed(); | |
1016 | + if (in_array($this->action, array( | |
919 | 1017 | 'add', |
920 | 1018 | 'edit', |
921 | 1019 | 'view', |
922 | 1020 | 'index' |
923 | 1021 | ))) { |
924 | - $hiddenFields = $this->getHiddenFieldsForAction($action); | |
1022 | + $hiddenFields = $this->getHiddenFieldsForAction($this->action); | |
925 | 1023 | $this->set('hiddenFields', $hiddenFields); |
926 | 1024 | $this->myDebug(compact("hiddenFields")); |
927 | - if (in_array($action, array( | |
1025 | + if (in_array($this->action, array( | |
928 | 1026 | 'add', |
929 | 1027 | 'edit' |
930 | 1028 | ))) { |
931 | - $mandatoryFields = $this->getMandatoryFieldsForAction($action); | |
1029 | + $mandatoryFields = $this->getMandatoryFieldsForAction($this->action); | |
932 | 1030 | $this->set('mandatoryFields', $mandatoryFields); |
933 | - $readOnlyFields = $this->getReadOnlyFieldsForAction($action); | |
1031 | + $readOnlyFields = $this->getReadOnlyFieldsForAction($this->action); | |
934 | 1032 | $this->set('readOnlyFields', $readOnlyFields); |
935 | - $haveDefaultValueFields = $this->getDefaultValueFieldsForAction($action); | |
1033 | + $haveDefaultValueFields = $this->getDefaultValueFieldsForAction($this->action); | |
936 | 1034 | |
937 | 1035 | // only for DEBUG : |
938 | 1036 | //$this->myDebug("mandat, ro, default fields=", $mandatoryFields, $readOnlyFields, $haveDefaultValueFields); | ... | ... |
src/Controller/MaterielsController.php
... | ... | @@ -152,6 +152,7 @@ class MaterielsController extends AppController |
152 | 152 | { |
153 | 153 | $this->myDebug("step 0A (specific): MaterielsController.initialize()"); |
154 | 154 | parent::initialize(); |
155 | + | |
155 | 156 | // On autorise l'action add SANS authentification (unauthenticated) |
156 | 157 | //$this->Auth->allow(['add']); |
157 | 158 | } |
... | ... | @@ -169,14 +170,11 @@ class MaterielsController extends AppController |
169 | 170 | public function beforeFilter(\Cake\Event\Event $event) |
170 | 171 | { |
171 | 172 | $this->myDebug("step 1A (specific): MaterielsController.beforeFilter()"); |
173 | + parent::beforeFilter($event); | |
172 | 174 | |
173 | - // ICI CEST OK | |
174 | - /* | |
175 | - $toto="tititoto"; | |
176 | - $this->set(compact('toto')); | |
177 | - */ | |
175 | + // Si on veut autoriser des actions SANS connexion, suffit de décommenter cette ligne | |
176 | + //$this->LdapAuth->allow([ 'view', 'index' ]); | |
178 | 177 | |
179 | - parent::beforeFilter($event); | |
180 | 178 | } |
181 | 179 | |
182 | 180 | |
... | ... | @@ -240,7 +238,7 @@ class MaterielsController extends AppController |
240 | 238 | } |
241 | 239 | */ |
242 | 240 | |
243 | - } | |
241 | + } // beforeRender() | |
244 | 242 | |
245 | 243 | |
246 | 244 | |
... | ... | @@ -248,7 +246,7 @@ class MaterielsController extends AppController |
248 | 246 | /** |
249 | 247 | * |
250 | 248 | * //param $user |
251 | - * @param $userFromSession | |
249 | + * @param $user | |
252 | 250 | * @return boolean Give authorization for materiels |
253 | 251 | * |
254 | 252 | * On définit ici les actions autorisées ou pas par ce contrôleur spécifique |
... | ... | @@ -256,19 +254,25 @@ class MaterielsController extends AppController |
256 | 254 | * CAKEPHP function |
257 | 255 | * |
258 | 256 | */ |
259 | - public function isAuthorized($userFromSession) { | |
257 | + //public function isAuthorized($userFromSession) { | |
258 | + public function isAuthorized($user) { | |
260 | 259 | //if (parent::isAuthorized($userFromSession)) return TRUE; |
261 | 260 | $this->myDebug("step 2A (specific): MaterielsController.isAuthorized(user)"); |
262 | - $this->myDebug("- user is:", $userFromSession); | |
261 | + $this->myDebug("- user is:", $user); | |
263 | 262 | /* ICI C'EST OK |
264 | 263 | $toto="tititoto"; |
265 | 264 | $this->set(compact('toto')); |
266 | 265 | */ |
267 | 266 | |
268 | - $this->userFromSession = $userFromSession; | |
269 | - $configuration = $this->confLabinvent; | |
267 | + /* | |
268 | + $prefix = $this->request->getParam('prefix'); | |
269 | + $this->myDebug("- prefix is $prefix"); | |
270 | + */ | |
271 | + | |
272 | + $this->userFromSession = $user; | |
273 | + //$configuration = $this->confLabinvent; | |
270 | 274 | // ex: 'uid' |
271 | - $this->userCname = $userFromSession[$configuration->ldap_authenticationType][0]; | |
275 | + $this->userCname = $user[$this->confLabinvent->ldap_authenticationType][0]; | |
272 | 276 | /* |
273 | 277 | * $role = TableRegistry::get('Users')->find() |
274 | 278 | * ->where(['username' => $user[$configuration->authentificationType_ldap][0]]) |
... | ... | @@ -280,12 +284,15 @@ class MaterielsController extends AppController |
280 | 284 | |
281 | 285 | // $this->myDebug("role is ".$role); |
282 | 286 | // debug("role is ".$role); |
287 | + | |
283 | 288 | // BETTER: |
284 | 289 | // $action = $this->request->getAttribute('params')['action']; |
285 | 290 | // $action = $this->request->getParam('action'); |
286 | - $action = $this->getActionPassed(); | |
291 | + //$action = $this->getActionPassed(); | |
292 | + | |
287 | 293 | // $id = (int) $this->request->getParam('pass.0'); |
288 | - $id = $this->getIdPassed(); | |
294 | + //$id = $this->getIdPassed(); | |
295 | + ///$this->action_id = $this->getIdPassed(); | |
289 | 296 | //debug($id); |
290 | 297 | |
291 | 298 | // ACTIONS QUI SONT TOUJOURS AUTORISÉES QUELQUE SOIT LE PROFIL |
... | ... | @@ -307,11 +314,20 @@ class MaterielsController extends AppController |
307 | 314 | return $article->user_id === $user['id']; |
308 | 315 | */ |
309 | 316 | |
317 | + $id = $this->action_id; | |
318 | + | |
310 | 319 | // On autorise ou pas l’action demandée : |
311 | - // - SUPERADMIN : par défaut il a tous les droits, non mais ! | |
312 | - // (sauf 'edit' si matos validé, pour faire comme pour admin) | |
313 | - if ( $this->userRole=='Super Administrateur' && $action!='edit' ) return true; | |
314 | - /* - Autres cas : on return isAuthorizedAction() | |
320 | + // - SUPERADMIN : par défaut il a TOUS les droits | |
321 | + // (sauf certaines actions afin de lui donner un comportement proche de ADMIN) | |
322 | + if ($this->USER_IS_SUPERADMIN) { | |
323 | + // edit ou add by copy => ssi CREATED | |
324 | + if ( $this->action =='edit' || ($this->action=='add' && $id>0) ) return $this->isCreated($id); | |
325 | + // archivage => admin only | |
326 | + //if ($this->action == 'statusArchived') return false; | |
327 | + // tout le reste => ok | |
328 | + return true; | |
329 | + } | |
330 | + /* - Autres users : on return isAuthorizedAction() | |
315 | 331 | * |
316 | 332 | * C’est une fonction interne développée pour labinvent |
317 | 333 | * Elle return true ou false selon que l’action est autorisée ou pas. |
... | ... | @@ -323,13 +339,16 @@ class MaterielsController extends AppController |
323 | 339 | * //return $this->isAuthorizedAction($this, $user, $role, $action, $id); |
324 | 340 | * Tout le reste en dessous de cette ligne devient inutile !!! |
325 | 341 | */ |
326 | - $this->myDebug("isAuthorizedAction ? " . $this->isAuthorizedAction2($this, $this->userRole, $action, $id, $userFromSession)); | |
342 | + $this->myDebug("isAuthorizedAction ? " . $this->isAuthorizedAction2($this, $this->userRole, $this->action, $id, $user)); | |
343 | + return $this->isAuthorizedAction(); | |
344 | + /* | |
327 | 345 | return $this->isAuthorizedAction( |
328 | 346 | $this->userRole, |
329 | - $action, $id, | |
330 | - $userFromSession, | |
347 | + $this->action, $id, | |
348 | + $user, | |
331 | 349 | $this->userCname |
332 | 350 | ); |
351 | + */ | |
333 | 352 | |
334 | 353 | } // isAuthorized |
335 | 354 | |
... | ... | @@ -340,7 +359,18 @@ class MaterielsController extends AppController |
340 | 359 | * Les 3 niveaux successifs parcourus par cakephp (isAuthorized() puis beforeRender() puis la VUE) font tous appels à cette MEME fonction |
341 | 360 | * On ne définit et modifie les droits qu'ici et nulle part ailleurs, surtout pas dans les vues !!! |
342 | 361 | */ |
343 | - private function isAuthorizedAction($role, $action, $id, $user, $userCname) { | |
362 | + private function isAuthorizedAction($action = null) { | |
363 | + if (!$action) $action = $this->action; | |
364 | + //$id = $this->getIdPassed(); | |
365 | + //debug("action $action, id $this->action_id"); | |
366 | + //return $this->isAuthorizedActionFor($action, $this->getIdPassed(), $this->userRole, $this->userFromSession, $this->userCname); | |
367 | + return $this->isAuthorizedActionFor( | |
368 | + $action?$action:$this->action, $this->action_id, | |
369 | + $this->userRole, | |
370 | + $this->userFromSession, $this->userCname | |
371 | + ); | |
372 | + } | |
373 | + private function isAuthorizedActionFor($action, $id, $role, $user, $userCname) { | |
344 | 374 | |
345 | 375 | /* |
346 | 376 | * Structure mise en place: |
... | ... | @@ -365,43 +395,82 @@ class MaterielsController extends AppController |
365 | 395 | |
366 | 396 | // (EP 17/5/19) CREATE (add) BY COPY (add/id) |
367 | 397 | case 'add': |
398 | + //debug("this is"); debug($this); | |
368 | 399 | //debug($id); |
369 | 400 | // add by COPY (il y a un id) => on traite |
370 | 401 | if ($id > 0) { |
402 | + | |
371 | 403 | // ON AUTORISE SEULEMENT LA COPIE D'UN MATOS "CREATED" |
372 | 404 | // not CREATED => pas le droit de copier un materiel pas CREATED |
373 | 405 | if (! $this->isCreated($id)) return FALSE; |
374 | 406 | // CREATED => ok, sous conditions |
375 | - else { | |
376 | - //debug("copie created"); | |
377 | - //if ($this->isCreated($id) || $this->isValidated($id)) { | |
378 | - /* | |
379 | - * if ($role == 'Utilisateur' && $this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0])) { | |
380 | - * return true; | |
381 | - * } else if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0])) { | |
382 | - * return true; | |
383 | - * } else if ($this->userHasRoleAtLeast('Administration')) { | |
384 | - * return true; | |
385 | - * } | |
386 | - */ | |
387 | - switch ($role) { | |
388 | - case 'Utilisateur': | |
389 | - //return $this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0]); | |
390 | - return $this->isHis($id, $user); | |
391 | - break; | |
392 | - case 'Responsable': | |
393 | - return ( $this->isHis($id, $user) || $this->isRespGroup($id, $userCname) ); | |
394 | - default: // All other roles (Admin and more) => OK | |
395 | - return TRUE; | |
396 | - break; | |
397 | - } | |
398 | - } // CREATED | |
407 | + //debug("copie created"); | |
408 | + //if ($this->isCreated($id) || $this->isValidated($id)) { | |
409 | + /* | |
410 | + * if ($role == 'Utilisateur' && $this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0])) { | |
411 | + * return true; | |
412 | + * } else if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0])) { | |
413 | + * return true; | |
414 | + * } else if ($this->userHasRoleAtLeast('Administration')) { | |
415 | + * return true; | |
416 | + * } | |
417 | + */ | |
418 | + switch ($role) { | |
419 | + case 'Utilisateur': | |
420 | + //return $this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0]); | |
421 | + return $this->isHis($id, $user); | |
422 | + case 'Responsable': | |
423 | + return ( $this->isHis($id, $user) || $this->isRespGroup($id, $userCname) ); | |
424 | + } | |
425 | + // All other roles (Admin and more) => OK | |
426 | + return TRUE; | |
399 | 427 | } // ADD by COPIE |
400 | 428 | break; // ADD |
401 | - | |
429 | + | |
430 | + // DELETE | |
431 | + case 'delete': | |
432 | + | |
433 | + /* | |
434 | + * (EP) ACL: | |
435 | + * SSi materiel CREATED, autoriser : | |
436 | + * - user : si createur de la fiche ou owner du materiel | |
437 | + * - resp : si responsable du groupe thematique ou metier de ce materiel | |
438 | + * - admin et + : toujours | |
439 | + */ | |
440 | + if ($this->isCreated($id)) { | |
441 | + /* | |
442 | + * if ($role == 'Utilisateur' && $this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0])) { | |
443 | + * return true; | |
444 | + * } else if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0])) { | |
445 | + * return true; | |
446 | + * } else if ($this->userHasRoleAtLeast('Administration')) { | |
447 | + * return true; | |
448 | + * } | |
449 | + */ | |
450 | + switch ($role) { | |
451 | + case 'Utilisateur': | |
452 | + //return ($this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0])); | |
453 | + return $this->isHis($id, $user); | |
454 | + break; | |
455 | + case 'Responsable': | |
456 | + return ($this->isRespGroup($id, $userCname)); | |
457 | + break; | |
458 | + // All other roles : Admin and more | |
459 | + default: | |
460 | + return true; | |
461 | + break; | |
462 | + } | |
463 | + } | |
464 | + break; | |
465 | + | |
402 | 466 | // UPDATE (edit) |
403 | 467 | // if ($action == 'edit') { |
404 | 468 | case 'edit': |
469 | + /* | |
470 | + debug("entity is"); debug($this->entity); | |
471 | + $this->getEntity(); | |
472 | + debug("entity is"); debug($this->entity); | |
473 | + */ | |
405 | 474 | // BETTER: |
406 | 475 | // $id = (int) $this->request->getAttribute('params')['pass'][0]; |
407 | 476 | // /$id = (int) $this->request->getParam('pass.0'); |
... | ... | @@ -424,18 +493,19 @@ class MaterielsController extends AppController |
424 | 493 | */ |
425 | 494 | |
426 | 495 | // (EP 23/5/19) NEW optimization |
427 | - $materiel = $this->Materiels->get($id, ['contain' => [ | |
428 | - 'SurCategories', | |
429 | - 'Categories', | |
430 | - 'SousCategories', | |
431 | - 'GroupesThematiques', | |
432 | - 'GroupesMetiers', | |
433 | - 'Organismes', | |
434 | - 'Sites', | |
435 | - 'Documents', | |
436 | - 'Emprunts', | |
437 | - 'Suivis', | |
438 | - 'Fournisseurs' | |
496 | + $materiel = $this->Materiels->get($id, [ | |
497 | + 'contain' => [ | |
498 | + 'SurCategories', | |
499 | + 'Categories', | |
500 | + 'SousCategories', | |
501 | + 'GroupesThematiques', | |
502 | + 'GroupesMetiers', | |
503 | + 'Organismes', | |
504 | + 'Sites', | |
505 | + 'Documents', | |
506 | + 'Emprunts', | |
507 | + 'Suivis', | |
508 | + 'Fournisseurs' | |
439 | 509 | ] |
440 | 510 | ]); |
441 | 511 | |
... | ... | @@ -458,82 +528,16 @@ class MaterielsController extends AppController |
458 | 528 | ($this->USER_IS_RESPONSABLE && $USER_IS_SAME_GROUP_AS_MATERIEL) |
459 | 529 | ); |
460 | 530 | return $CAN_EDIT; |
531 | + // edit | |
532 | + | |
461 | 533 | |
462 | - // (EP 23/5/19) OLD METHOD | |
463 | - /* | |
464 | - // (EP 17/5/19) ON AUTORISE SEULEMENT LA MODIF D'UN MATOS CREATED | |
465 | - // UN user Admin ou plus ne pourra le modifier qu'à condition de le "dé-valider" avant | |
466 | - if ($this->isCreated($id)) { | |
467 | - //if ($this->isCreated($id) || $this->isValidated($id)) { | |
468 | - /STAR | |
469 | - * if ($role == 'Utilisateur' && $this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0])) { | |
470 | - * return true; | |
471 | - * } else if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0])) { | |
472 | - * return true; | |
473 | - * } else if ($this->userHasRoleAtLeast('Administration')) { | |
474 | - * return true; | |
475 | - * } | |
476 | - STAR/ | |
477 | - switch ($role) { | |
478 | - case 'Utilisateur': | |
479 | - //return $this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0]); | |
480 | - return $this->isHis($id, $user); | |
481 | - break; | |
482 | - case 'Responsable': | |
483 | - // return ($this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0])); | |
484 | - //return ($this->isRespGroup($id, $userCname)); | |
485 | - //return ($this->isRespGroup($id, $userCname) || $this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0])); | |
486 | - return ( $this->isHis($id, $user) || $this->isRespGroup($id, $userCname) ); | |
487 | - default: // All other roles (Admin and more) => OK | |
488 | - return TRUE; | |
489 | - break; | |
490 | - } | |
491 | - } | |
492 | - /STAR | |
493 | - (EP 17/5/19) : Ben non, pas le droit, faudra dé-valider avant, non mais !!! | |
494 | - if ($this->userHasRoleAtLeast('Administration Plus')) { | |
495 | - return true; | |
496 | - } | |
497 | - STAR/ | |
498 | - break; // EDIT | |
499 | - */ | |
500 | - | |
501 | - // DELETE | |
502 | - case 'delete': | |
503 | - | |
504 | - /* | |
505 | - * (EP) ACL: | |
506 | - * SSi materiel CREATED, autoriser : | |
507 | - * - user : si createur de la fiche ou owner du materiel | |
508 | - * - resp : si responsable du groupe thematique ou metier de ce materiel | |
509 | - * - admin et + : toujours | |
510 | - */ | |
511 | - if ($this->isCreated($id)) { | |
512 | - /* | |
513 | - * if ($role == 'Utilisateur' && $this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0])) { | |
514 | - * return true; | |
515 | - * } else if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0])) { | |
516 | - * return true; | |
517 | - * } else if ($this->userHasRoleAtLeast('Administration')) { | |
518 | - * return true; | |
519 | - * } | |
520 | - */ | |
521 | - switch ($role) { | |
522 | - case 'Utilisateur': | |
523 | - //return ($this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0])); | |
524 | - return $this->isHis($id, $user); | |
525 | - break; | |
526 | - case 'Responsable': | |
527 | - return ($this->isRespGroup($id, $userCname)); | |
528 | - break; | |
529 | - // All other roles : Admin and more | |
530 | - default: | |
531 | - return true; | |
532 | - break; | |
533 | - } | |
534 | - } | |
535 | - break; | |
534 | + case 'export': | |
535 | + // if ($this->userHasRoleAtLeast('Responsable')) { | |
536 | + return $this->USER_IS_RESP_AT_LEAST(); | |
536 | 537 | |
538 | + case 'getDateGarantie': | |
539 | + return true; | |
540 | + | |
537 | 541 | case 'statusCreated': // de-validation d'un materiel (repasse à CREATED) |
538 | 542 | // /$id = (int) $this->request->getParam('pass.0'); |
539 | 543 | // Admin + ok |
... | ... | @@ -574,21 +578,17 @@ class MaterielsController extends AppController |
574 | 578 | break; |
575 | 579 | |
576 | 580 | case 'statusArchived': |
581 | + return $this->isToBeArchived($id) && $this->USER_IS_ADMIN_AT_LEAST(); | |
577 | 582 | // /$id = (int) $this->request->getAttribute('params')['pass'][0]; |
578 | 583 | // if ($this->userHasRoleAtLeast('Administration')) { |
579 | 584 | // if ($role == 'Super Administrateur') { |
585 | + /* | |
580 | 586 | if ( $this->isToBeArchived($id) && $this->USER_IS_ADMIN_AT_LEAST() ) { |
581 | 587 | if ($this->USER_IS_SUPERADMIN()) return false; |
582 | 588 | return true; |
583 | 589 | } |
584 | 590 | break; |
585 | - | |
586 | - case 'export': | |
587 | - // if ($this->userHasRoleAtLeast('Responsable')) { | |
588 | - if ($this->USER_IS_RESP_AT_LEAST()) { | |
589 | - return true; | |
590 | - } | |
591 | - break; | |
591 | + */ | |
592 | 592 | |
593 | 593 | /* |
594 | 594 | * if (in_array($action, [ |
... | ... | @@ -603,11 +603,17 @@ class MaterielsController extends AppController |
603 | 603 | case 'setLabelIsPlaced': |
604 | 604 | case 'setLabelIsPlacedOrNotPlaced': |
605 | 605 | case 'setLabelIsNotPlaced': |
606 | - case 'printLabelRuban': | |
606 | + return $this->USER_IS_ADMIN_AT_LEAST(); | |
607 | + /* | |
607 | 608 | // if ($this->userHasRoleAtLeast('Administration')) { |
608 | - if ($this->USER_IS_ADMIN_AT_LEAST()) | |
609 | - return true; | |
609 | + if ($this->USER_IS_ADMIN_AT_LEAST()) return true; | |
610 | 610 | break; |
611 | + */ | |
612 | + | |
613 | + case 'printLabelRuban': | |
614 | + $materiel = $this->Materiels->get($id); | |
615 | + $IS_VALIDATED = ($materiel->status == 'VALIDATED'); | |
616 | + return $IS_VALIDATED && $this->confLabinvent->hasPrinter && $this->USER_IS_ADMIN_OR_MORE; | |
611 | 617 | |
612 | 618 | /* |
613 | 619 | * // Autorisations par defaut: |
... | ... | @@ -621,8 +627,10 @@ class MaterielsController extends AppController |
621 | 627 | // => DEFAULT PARENT RULE |
622 | 628 | // (on appelle la méthode isAuthorized() de AppController) |
623 | 629 | return parent::isAuthorized($user); |
630 | + | |
624 | 631 | } // isAuthorizedAction() |
625 | 632 | |
633 | + | |
626 | 634 | /* |
627 | 635 | * @todo A déplacer dans Model/Table/TableMateriels |
628 | 636 | * cf https://book.cakephp.org/3.0/fr/tutorials-and-examples/blog-auth-example/auth.html |
... | ... | @@ -630,6 +638,9 @@ class MaterielsController extends AppController |
630 | 638 | // True if materiel with id $id is owned by $nomCreateur |
631 | 639 | public function isOwnedBy($id, $nomCreateur) |
632 | 640 | { |
641 | + $entity = $this->getEntity($id); | |
642 | + return in_array($nomCreateur, [$entity->nom_createur, $entity->nom_responsable]); | |
643 | + /* | |
633 | 644 | return ($this->Materiels->exists([ |
634 | 645 | 'id' => $id, |
635 | 646 | 'nom_createur' => $nomCreateur |
... | ... | @@ -637,6 +648,7 @@ class MaterielsController extends AppController |
637 | 648 | 'id' => $id, |
638 | 649 | 'nom_responsable' => $nomCreateur |
639 | 650 | ])); |
651 | + */ | |
640 | 652 | } |
641 | 653 | |
642 | 654 | // True if materiel with id $id is owned by current user |
... | ... | @@ -646,69 +658,69 @@ class MaterielsController extends AppController |
646 | 658 | |
647 | 659 | public function isRespGroup($id, $loginResponsable) |
648 | 660 | { |
649 | - $userFromTable = TableRegistry::get('Users')->find() | |
650 | - ->where([ | |
651 | - 'username' => $loginResponsable | |
652 | - ]) | |
661 | + // Get user | |
662 | + $u = TableRegistry::getTableLocator()->get('Users') | |
663 | + ->find() | |
664 | + ->where(['username' => $loginResponsable]) | |
653 | 665 | ->first(); |
654 | - $u = $userFromTable; | |
655 | 666 | |
656 | - if ($u['groupes_metier_id'] !== null && $u['groupes_metier_id'] != TableRegistry::get('GroupesMetiers')->find() | |
657 | - ->where([ | |
658 | - 'nom =' => 'N/A' | |
659 | - ]) | |
660 | - ->first()['id']) { | |
661 | - return ($this->Materiels->exists([ | |
662 | - 'id' => $id, | |
663 | - 'groupes_metier_id' => $u['groupes_metier_id'] | |
664 | - ])); | |
665 | - } else if ($u['groupe_thematique_id'] !== null && $u['groupe_thematique_id'] != TableRegistry::get('GroupesThematiques')->find() | |
666 | - ->where([ | |
667 | - 'nom =' => 'N/A' | |
668 | - ]) | |
669 | - ->first()['id']) { | |
670 | - // BETTER: | |
671 | - return ($this->Materiels->exists([ | |
672 | - 'id' => $id, | |
673 | - 'groupes_thematique_id' => $u['groupe_thematique_id'] | |
674 | - ])); | |
675 | - } else { | |
676 | - return false; | |
677 | - } | |
678 | - } | |
679 | - | |
680 | - public function isCreated($id) | |
681 | - { | |
682 | - return $this->Materiels->exists([ | |
683 | - 'id' => $id, | |
684 | - 'status' => 'CREATED' | |
685 | - ]); | |
686 | - } | |
687 | - | |
688 | - public function isValidated($id) | |
689 | - { | |
690 | - return $this->Materiels->exists([ | |
691 | - 'id' => $id, | |
692 | - 'status' => 'VALIDATED' | |
693 | - ]); | |
694 | - } | |
695 | - | |
696 | - public function isToBeArchived($id) | |
697 | - { | |
698 | - return $this->Materiels->exists([ | |
699 | - 'id' => $id, | |
700 | - 'status' => 'TOBEARCHIVED' | |
701 | - ]); | |
702 | - } | |
667 | + // Responsable groupe métier ? | |
668 | + $group = 'groupes_metier'; | |
669 | + $group_fk = $group.'_id'; | |
670 | + if ( | |
671 | + $u[$group_fk] !== null | |
672 | + && | |
673 | + $u[$group_fk] != TableRegistry::getTableLocator()->get('GroupesMetiers') | |
674 | + ->find() | |
675 | + ->where(['nom =' => 'N/A']) | |
676 | + ->first()['id'] | |
677 | + ) return $this->getEntity($id)->$group_fk == $u[$group_fk]; | |
678 | + /* | |
679 | + return $this->Materiels->exists([ | |
680 | + 'id' => $id, | |
681 | + 'groupes_metier_id' => $u['groupes_metier_id'] | |
682 | + ]); | |
683 | + */ | |
684 | + | |
685 | + // Responsable groupe thématique ? | |
686 | + $group = 'groupe_thematique'; | |
687 | + $group_fk = $group.'_id'; | |
688 | + if ( | |
689 | + $u[$group_fk] !== null | |
690 | + && | |
691 | + $u[$group_fk] != TableRegistry::getTableLocator()->get('GroupesThematiques') | |
692 | + ->find() | |
693 | + ->where(['nom =' => 'N/A']) | |
694 | + ->first()['id'] | |
695 | + ) return $this->getEntity($id)->$group_fk == $u[$group_fk]; | |
696 | + /* | |
697 | + return $this->Materiels->exists([ | |
698 | + 'id' => $id, | |
699 | + 'groupes_thematique_id' => $u['groupe_thematique_id'] | |
700 | + ]); | |
701 | + */ | |
702 | + | |
703 | + // sinon, pas responsable de groupe | |
704 | + return false; | |
705 | + | |
706 | + } // isRespGroup | |
707 | + | |
703 | 708 | |
704 | - public function isArchived($id) | |
705 | - { | |
709 | + public function hasStatus($id, $status) { | |
710 | + return $this->getEntity($id)->status == $status; | |
711 | + /* | |
706 | 712 | return $this->Materiels->exists([ |
707 | 713 | 'id' => $id, |
708 | - 'status' => 'ARCHIVED' | |
714 | + 'status' => $status | |
709 | 715 | ]); |
716 | + */ | |
710 | 717 | } |
718 | + public function isCreated($id) { return $this->hasStatus($id, 'CREATED'); } | |
719 | + public function isValidated($id) { return $this->hasStatus($id, 'VALIDATED'); } | |
720 | + public function isToBeArchived($id) { return $this->hasStatus($id, 'TOBEARCHIVED'); } | |
721 | + public function isArchived($id) { return $this->hasStatus($id, 'ARCHIVED'); } | |
711 | 722 | |
723 | + | |
712 | 724 | /** |
713 | 725 | * Index method |
714 | 726 | * |
... | ... | @@ -924,46 +936,31 @@ class MaterielsController extends AppController |
924 | 936 | $CAN_INVALIDATE = !$IS_CREATED && $CAN_VALIDATE_OR_INVALIDATE; |
925 | 937 | $CAN_TBA = $IS_VALIDATED && $CONTEXT1; |
926 | 938 | $CAN_ARCHIVE = $IS_TOBEARCHIVED && $this->USER_IS_ADMIN_OR_MORE; |
927 | - $this->set(compact('CAN_VALIDATE')); | |
928 | - $this->set(compact('CAN_INVALIDATE')); | |
929 | - $this->set(compact('CAN_TBA')); | |
930 | - $this->set(compact('CAN_ARCHIVE')); | |
939 | + $this->set(compact('CAN_VALIDATE', 'CAN_INVALIDATE', 'CAN_TBA', 'CAN_ARCHIVE')); | |
931 | 940 | |
932 | 941 | $CAN_ATTACH_A_DOC = $CONTEXT1; |
933 | - $this->set(compact('CAN_ATTACH_A_DOC')); | |
934 | - | |
935 | 942 | $CAN_MANAGE_SUIVIS = $CONTEXT1; |
936 | - $this->set(compact('CAN_MANAGE_SUIVIS')); | |
937 | - | |
938 | 943 | $CAN_MANAGE_EMPRUNTS = $CONTEXT1; |
939 | - $this->set(compact('CAN_MANAGE_EMPRUNTS')); | |
940 | - | |
941 | 944 | $CAN_MANAGE_FILES = $CONTEXT1; |
942 | - $this->set(compact('CAN_MANAGE_FILES')); | |
945 | + $this->set(compact('CAN_ATTACH_A_DOC', 'CAN_MANAGE_SUIVIS', 'CAN_MANAGE_EMPRUNTS', 'CAN_MANAGE_FILES')); | |
943 | 946 | |
944 | 947 | // NEW |
945 | - //TODO: faire la meme chose pour tous les autres $CAN_ | |
946 | - $CAN_EDIT = $this->isAuthorizedAction($this->userRole, 'edit', $id, $this->userFromSession, $this->userCname); | |
948 | + //TODO: faire la meme chose pour tous les $CAN_* | |
949 | + //$CAN_EDIT = $this->isAuthorizedAction($this->userRole, 'edit', $id, $this->userFromSession, $this->userCname); | |
950 | + $CAN_EDIT = $this->isAuthorizedAction('edit'); | |
947 | 951 | // OLD |
948 | 952 | //$CAN_EDIT = $IS_CREATED && $CAN_ATTACH_A_DOC; |
949 | - $this->set(compact('CAN_EDIT')); | |
950 | - | |
951 | 953 | $CAN_COPY = $CAN_EDIT; |
952 | - $this->set(compact('CAN_COPY')); | |
953 | - | |
954 | - $configuration = $this->confLabinvent; | |
955 | - $CAN_PRINT_LABEL = $IS_VALIDATED && $configuration->hasPrinter && $this->USER_IS_ADMIN_OR_MORE; | |
956 | - $this->set(compact('CAN_PRINT_LABEL')); | |
957 | 954 | |
955 | + //$CAN_PRINT_LABEL = $IS_VALIDATED && $this->confLabinvent->hasPrinter && $this->USER_IS_ADMIN_OR_MORE; | |
956 | + //$CAN_PRINT_LABEL = $this->isAuthorizedAction($this->userRole, 'printLabelRuban', $id, $this->userFromSession, $this->userCname); | |
957 | + $CAN_PRINT_LABEL = $this->isAuthorizedAction('printLabelRuban'); | |
958 | 958 | |
959 | + $this->set(compact('CAN_EDIT', 'CAN_COPY', 'CAN_PRINT_LABEL')); | |
959 | 960 | |
960 | 961 | // $status = $this->allStatus[$materiel->status]; |
961 | 962 | $status = self::allStatus[$materiel->status]; |
962 | - $this->set('IS_CREATED', $IS_CREATED); | |
963 | - $this->set('IS_VALIDATED', $IS_VALIDATED); | |
964 | - $this->set('IS_TOBEARCHIVED', $IS_TOBEARCHIVED); | |
965 | - $this->set('IS_ARCHIVED', $IS_ARCHIVED); | |
966 | - $this->set('status', $status); | |
963 | + $this->set(compact('status', 'IS_CREATED', 'IS_VALIDATED', 'IS_TOBEARCHIVED', 'IS_ARCHIVED')); | |
967 | 964 | |
968 | 965 | $sites = TableRegistry::getTableLocator()->get('Sites'); |
969 | 966 | //$sites = TableLocator::get('Sites'); |
... | ... | @@ -1071,6 +1068,7 @@ class MaterielsController extends AppController |
1071 | 1068 | //$this->myDebug($materiel); |
1072 | 1069 | } |
1073 | 1070 | |
1071 | + | |
1074 | 1072 | /* SI POST |
1075 | 1073 | * Les données ont été saisies et postées |
1076 | 1074 | * On va donc les sauvegarder |
... | ... | @@ -1227,7 +1225,7 @@ class MaterielsController extends AppController |
1227 | 1225 | 'valueField' => 'nom', |
1228 | 1226 | 'order' => 'Sites.nom' |
1229 | 1227 | ]); |
1230 | - $designation = $this->Materiels->find('list', [ | |
1228 | + $designations = $this->Materiels->find('list', [ | |
1231 | 1229 | 'keyField' => 'designation', |
1232 | 1230 | 'valueField' => 'designation', |
1233 | 1231 | 'conditions' => array( |
... | ... | @@ -1440,7 +1438,7 @@ class MaterielsController extends AppController |
1440 | 1438 | 'groupesThematiques', 'groupesMetiers', |
1441 | 1439 | 'organismes', 'sites', |
1442 | 1440 | 'domaineresp', |
1443 | - 'designation', | |
1441 | + //'designations', | |
1444 | 1442 | 'lieu_detail', |
1445 | 1443 | 'fournisseurs', |
1446 | 1444 | //'utilisateurs', |
... | ... | @@ -1454,6 +1452,7 @@ class MaterielsController extends AppController |
1454 | 1452 | 'materiel', |
1455 | 1453 | ]); |
1456 | 1454 | */ |
1455 | + | |
1457 | 1456 | |
1458 | 1457 | } //add_or_edit() |
1459 | 1458 | ... | ... |
src/Controller/PagesController.php
... | ... | @@ -78,44 +78,46 @@ class PagesController extends AppController |
78 | 78 | // (20200424 EP) |
79 | 79 | public function beforeFilter(\Cake\Event\Event $event) { |
80 | 80 | $this->myDebug("step 1A (specific): PagesController.beforeFilter()"); |
81 | + // On donne d'abord les autorisations par défaut de AppController | |
82 | + parent::beforeFilter($event); | |
81 | 83 | |
84 | + // Puis on ajoute les autorisations spécifiques | |
82 | 85 | /* |
83 | 86 | $path = func_get_args(); |
84 | 87 | pr($path); |
85 | 88 | $page = null; |
86 | 89 | if (! empty($path[0])) $page = $path[0]; |
87 | 90 | */ |
88 | - $page = $this->request->getParam('pass.0'); | |
89 | - | |
90 | - // On autorise l'action display SANS connexion | |
91 | - // mais seulement pour la page 'about' | |
92 | - //if (in_array($path[0], ['about', 'tools'])) echo "yes"; else echo "no"; | |
93 | - if ( $page == 'about' ) $this->LdapAuth->allow(['display']); | |
94 | - //if ( in_array($page, ['about', 'tools']) ) $this->LdapAuth->allow(['display']); | |
91 | + $this->action = $this->getActionPassed(); | |
92 | + if ($this->action == "display") { | |
93 | + $this->page = $this->request->getParam('pass.0'); | |
94 | + | |
95 | + // On autorise l'action display SANS connexion | |
96 | + // mais seulement pour la page 'about' | |
97 | + //if (in_array($path[0], ['about', 'tools'])) echo "yes"; else echo "no"; | |
98 | + if ( $this->page == 'about' ) $this->LdapAuth->allow(['display']); | |
99 | + //if ( in_array($page, ['about', 'tools']) ) $this->LdapAuth->allow(['display']); | |
100 | + } | |
95 | 101 | |
96 | - // Pour le reste, on donne les droits par défaut de AppController | |
97 | - parent::beforeFilter($event); | |
98 | 102 | } |
99 | 103 | |
100 | 104 | public function isAuthorized($user) { |
101 | 105 | $this->myDebug("step 2A (specific): PagesController.isAuthorized(user)"); |
102 | 106 | $this->myDebug("- user is:", $user); |
103 | 107 | |
104 | - $action = $this->getActionPassed(); | |
105 | - | |
106 | - if ($action == 'display') { | |
108 | + if ($this->action == 'display') { | |
107 | 109 | |
108 | - $page = $this->request->getParam('pass.0'); | |
110 | + //$page = $this->request->getParam('pass.0'); | |
109 | 111 | |
110 | 112 | // Action display SANS nom de page => on redirige sur '/' |
111 | 113 | // (c'est à dire sur /pages/home, c'est à dire /pages/display/home) |
112 | 114 | // cf config/routes.php qui définit l'action "display" par défaut pour tout ce qui commence par pages/ |
113 | - if (! $page) { | |
115 | + if (! $this->page) { | |
114 | 116 | $this->redirect('/'); |
115 | 117 | return false; |
116 | 118 | } |
117 | 119 | |
118 | - switch ($page) { | |
120 | + switch ($this->page) { | |
119 | 121 | |
120 | 122 | // Page d'accueil autorisée à tous les profils (roles) |
121 | 123 | case 'home': return true; |
... | ... | @@ -160,7 +162,7 @@ class PagesController extends AppController |
160 | 162 | // Action display SANS nom de page => on redirige sur '/' |
161 | 163 | // (c'est à dire sur /pages/home, c'est à dire /pages/display/home) |
162 | 164 | // cf config/routes.php qui définit l'action "display" par défaut pour tout ce qui commence par pages/ |
163 | - $page = $this->request->getParam('pass.0'); | |
165 | + ///$page = $this->request->getParam('pass.0'); | |
164 | 166 | /* |
165 | 167 | if (! $page) $this->redirect('/'); |
166 | 168 | */ |
... | ... | @@ -177,7 +179,7 @@ class PagesController extends AppController |
177 | 179 | if (! empty($path[1])) $subpage = $path[1]; |
178 | 180 | */ |
179 | 181 | $this->myDebug("- page is:"); |
180 | - $this->myDebug($page); | |
182 | + $this->myDebug($this->page); | |
181 | 183 | $this->myDebug("- subpage is:"); |
182 | 184 | $this->myDebug($subpage); |
183 | 185 | |
... | ... | @@ -220,13 +222,14 @@ class PagesController extends AppController |
220 | 222 | */ |
221 | 223 | |
222 | 224 | // Finalement, on affiche la $page demandée (avec render()) |
223 | - $this->set(compact('page', 'subpage')); | |
225 | + $this->set('page', $this->page); | |
226 | + $this->set(compact('subpage')); | |
224 | 227 | //debug(implode('/', $path)); |
225 | 228 | //debug(implode('/', array($page,$subpage))); |
226 | 229 | try { |
227 | 230 | //$this->render(implode('/', $path)); |
228 | 231 | //$this->render("$page/$subpage"); |
229 | - $this->render($subpage ? "$page/$subpage" : $page); | |
232 | + $this->render($subpage ? $this->page.'/'.$subpage : $this->page); | |
230 | 233 | //$this->render(implode('/', array($page,$subpage))); |
231 | 234 | } catch (MissingTemplateException $e) { |
232 | 235 | if (Configure::read('debug')) throw $e; | ... | ... |
src/Controller/QrCodesController.php
... | ... | @@ -7,6 +7,15 @@ use \PHPQRCode\QRcode; |
7 | 7 | class QrCodesController extends AppController |
8 | 8 | { |
9 | 9 | |
10 | + public function isAuthorized($user) { | |
11 | + return ($this->action == 'creer'); | |
12 | + // Si aucune règle ci-dessus n'a return true (ou false) | |
13 | + // => DEFAULT PARENT RULE | |
14 | + // (on appelle la méthode isAuthorized() de AppController) | |
15 | + //return parent::isAuthorized($user); | |
16 | + } // isAuthorizedAction() | |
17 | + | |
18 | + | |
10 | 19 | // @todo Autoriser "creer" dans isAuthorized de ce controleur, et non pas dans celui de AppController !!! |
11 | 20 | public function creer($message = null) |
12 | 21 | { | ... | ... |
src/Controller/SuivisController.php
... | ... | @@ -29,15 +29,18 @@ class SuivisController extends AppController |
29 | 29 | * ->first()['role']; |
30 | 30 | * $action = $this->request->getAttribute('params')['action']; |
31 | 31 | */ |
32 | + /* | |
32 | 33 | $action = $this->getActionPassed(); |
33 | 34 | $role = $this->getUserRole($user); |
35 | + */ | |
34 | 36 | |
35 | 37 | // if ($this->userHasRoleAtLeast('Administration')) |
36 | - if ($this->USER_IS_ADMIN_AT_LEAST()) | |
37 | - return true; | |
38 | + if ($this->USER_IS_ADMIN_AT_LEAST()) return true; | |
39 | + | |
40 | + if ($this->action == 'getNextDate') return true; | |
38 | 41 | |
39 | 42 | // Pour un "utilisateur" |
40 | - if (in_array($action, [ | |
43 | + if (in_array($this->action, [ | |
41 | 44 | 'edit', |
42 | 45 | 'delete' |
43 | 46 | ])) { |
... | ... | @@ -45,9 +48,13 @@ class SuivisController extends AppController |
45 | 48 | $id = $this->getIdPassed(); |
46 | 49 | if ($this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0])) |
47 | 50 | return true; |
48 | - if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->ldap_authenticationType][0])) | |
51 | + | |
52 | + //if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->ldap_authenticationType][0])) | |
53 | + if ($this->userRole == 'Responsable' && $this->isRespGroup($id, $user[$configuration->ldap_authenticationType][0])) | |
49 | 54 | return true; |
50 | 55 | } |
56 | + | |
57 | + // par défaut : | |
51 | 58 | return parent::isAuthorized($user); |
52 | 59 | } |
53 | 60 | ... | ... |
src/Controller/UsersController.php
... | ... | @@ -84,12 +84,14 @@ class UsersController extends AppController |
84 | 84 | return parent::isAuthorized($user); |
85 | 85 | } |
86 | 86 | |
87 | + // ref: https://book.cakephp.org/4/fr/controllers/components/authentication.html#identifier-les-utilisateurs-et-les-connecter | |
87 | 88 | public function login() |
88 | 89 | { |
89 | 90 | $this->myDebug("step 2: UsersController.login()"); |
90 | 91 | |
91 | 92 | // Un utilisateur a essayé de se loguer |
92 | 93 | if ($this->request->is('post')) { |
94 | + // Identification du user en utilisant les données POST | |
93 | 95 | // sans LDAP |
94 | 96 | //$user = $this->Auth->identify(); |
95 | 97 | // avec LDAP |
... | ... | @@ -100,9 +102,10 @@ class UsersController extends AppController |
100 | 102 | // Le login a été accepté |
101 | 103 | //if ($user != FALSE) { |
102 | 104 | if ($user) { |
105 | + // Sauvegarde le user dans la session | |
103 | 106 | //$this->Auth->setUser($user); |
104 | - $this->LdapAuth->setUser($user); | |
105 | - // On va maintenant à la page qui etait demandee | |
107 | + $this->LdapAuth->setUser($user); | |
108 | + // On va maintenant à la page qui etait demandée | |
106 | 109 | //return $this->redirect($this->Auth->redirectUrl()); |
107 | 110 | return $this->redirect($this->LdapAuth->redirectUrl()); |
108 | 111 | } | ... | ... |
src/Model/Entity/User.php
... | ... | @@ -50,7 +50,8 @@ class User extends Entity |
50 | 50 | protected function _setPassword($password) |
51 | 51 | { |
52 | 52 | //return (new DefaultPasswordHasher())->hash($password); |
53 | - if (strlen($password)) { | |
53 | + //if (strlen($password)) { | |
54 | + if (strlen($password)>0) { | |
54 | 55 | $hasher = new DefaultPasswordHasher(); |
55 | 56 | return $hasher->hash($password); |
56 | 57 | } | ... | ... |
src/Model/Table/UsersTable.php
... | ... | @@ -131,6 +131,13 @@ class UsersTable extends AppTable |
131 | 131 | |
132 | 132 | function beforeSave($event, $entity, $options) |
133 | 133 | { |
134 | + /* | |
135 | + $entity = $event->getData('entity'); | |
136 | + if ($entity->isNew()) { | |
137 | + $hasher = new DefaultPasswordHasher(); | |
138 | + ... | |
139 | + } | |
140 | + */ | |
134 | 141 | if (! empty($entity->get('newname')) && ! empty($entity->get('newgivenname'))) { |
135 | 142 | $entity->set('nom', $entity->get('newname') . ' ' . $entity->get('newgivenname')); |
136 | 143 | } | ... | ... |
src/Template/Layout/default.ctp
... | ... | @@ -156,7 +156,10 @@ $this->append('script', $this->Html->script(['script', 'DatepickerConfig', 'onTa |
156 | 156 | |
157 | 157 | <!-- Message Flash éventuel --> |
158 | 158 | <?= $this->Flash->render() ?> |
159 | - <?= $this->Flash->render('auth') ?> | |
159 | + <!-- | |
160 | + Avant 3.4.0, cette ligne sera également nécessaire | |
161 | + <= $this->Flash->render('auth') ?> | |
162 | + --> | |
160 | 163 | |
161 | 164 | <!-- |
162 | 165 | Contenu complet de la page web | ... | ... |
src/Template/Materiels/add_edit.ctp
... | ... | @@ -74,7 +74,8 @@ $materiel = $entity; // @deprecated |
74 | 74 | $entity_name = 'matériel'; |
75 | 75 | |
76 | 76 | $domaineresp = $domaineresp; |
77 | -$designation = $designation; | |
77 | +//$designations = $designations; | |
78 | +//foreach ($designations as $f) debug($f); | |
78 | 79 | $fournisseurs = $fournisseurs; |
79 | 80 | //foreach ($fournisseurs as $l) debug($l); |
80 | 81 | //foreach ($fournisseurs as $k=>$v) debug("$k => $v"); |
... | ... | @@ -335,13 +336,29 @@ if (isset($cpMateriel)) { |
335 | 336 | |
336 | 337 | // - designation |
337 | 338 | echo $this->Form->control('designation', [ |
339 | + //'type' => 'text', | |
338 | 340 | 'label' => 'Désignation', |
339 | - //'default' => $Designation | |
341 | + //'default' => $Designation, | |
340 | 342 | // ADD only |
341 | - 'default' => $materiel->designation, | |
343 | + //'default' => $materiel->designation, | |
344 | + //'default' => $designations, | |
345 | + //'default' => $designations->toArray(), | |
342 | 346 | // EDIT only |
343 | 347 | 'disabled' => $IS_ADD ? false : $isReadonlyField('designation', $myReadonlyFields) |
344 | 348 | ]); |
349 | + /* | |
350 | + $value = $IS_EDIT ? array_shift($designation_edit) : ''; | |
351 | + ?> | |
352 | + <div class="form-group text"> | |
353 | + <label label class="control-label" for="designation">Désignation</label> | |
354 | + <!-- autocomplete="on" => ajoute les éléments saisis auparavant (depuis l'historique du navigateur) => pas bon --> | |
355 | + <input list="desig" id="designation" name="designation" value="<?=$value?>" type="text" placeholder="choisir/ajouter une désignation" autocomplete="off"> | |
356 | + <datalist id="desig"> | |
357 | + <?php foreach ($designations as $v) echo "<option value='$v'>"; ?> | |
358 | + </datalist> | |
359 | + </div> | |
360 | + <?php | |
361 | + */ | |
345 | 362 | |
346 | 363 | // - materiel HS ? |
347 | 364 | if ($IS_EDIT && |
... | ... | @@ -375,7 +392,7 @@ if (isset($cpMateriel)) { |
375 | 392 | 'empty' => 'Choisir un domaine', |
376 | 393 | //'default' => $Sur_categ_id |
377 | 394 | // ADD only |
378 | - 'default' => $materiel->sur_categorie_id, | |
395 | + //'default' => $materiel->sur_categorie_id, | |
379 | 396 | // EDIT only |
380 | 397 | 'readonly' => $IS_ADD ? false : $isReadonlyField('sur_categorie_id', $myReadonlyFields), |
381 | 398 | 'disabled' => $IS_ADD ? false : $isReadonlyField('sur_categorie_id', $myReadonlyFields) | ... | ... |
src/Template/Materiels/view.ctp
... | ... | @@ -70,6 +70,8 @@ $echoActionButton = $echoActionButton; |
70 | 70 | // Documents attachés photo |
71 | 71 | $photo_formats = ['png','jpg','jpeg']; |
72 | 72 | |
73 | + | |
74 | + | |
73 | 75 | /* (EP) moved to controller |
74 | 76 | function $echoActionButton($html, $icon_class, $title, $action, $id, $tip='', $controller='materiels', $mat=NULL, $photo=NULL) { |
75 | 77 | echo $html->link( | ... | ... |
tests/TestCase/Controller/MaterielsControllerTest.php
... | ... | @@ -20,7 +20,8 @@ class MaterielsControllerTest extends General { |
20 | 20 | //class MaterielsControllerTest extends IntegrationTestCase { |
21 | 21 | |
22 | 22 | // Si DEBUG, affiche plus d'infos |
23 | - private $DEBUG=FALSE; | |
23 | + //private $DEBUG=false; | |
24 | + private $DEBUG=true; | |
24 | 25 | |
25 | 26 | /** |
26 | 27 | * Fixtures |
... | ... | @@ -142,11 +143,11 @@ class MaterielsControllerTest extends General { |
142 | 143 | $this->get('/materiels/index'); |
143 | 144 | if (! $COPIED) |
144 | 145 | $this->assertResponseNotContains("Liste des matériels (".$nbmat.")", $role); |
145 | - else { | |
146 | - $this->assertResponseContains("Liste des matériels (".$nbmat.")", $role); | |
147 | - if (isset($designation)) $this->assertResponseContains($designation, "Le matériel ne s'ajoute pas correctement."); | |
148 | - if (isset($num_inventaire)) $this->assertResponseContains($num_inventaire, "La génération du n°de labo n'est pas bonne."); | |
149 | - } | |
146 | + else { | |
147 | + $this->assertResponseContains("Liste des matériels (".$nbmat.")", $role); | |
148 | + if (isset($designation)) $this->assertResponseContains($designation, "Le matériel ne s'ajoute pas correctement."); | |
149 | + if (isset($num_inventaire)) $this->assertResponseContains($num_inventaire, "La génération du n°de labo n'est pas bonne."); | |
150 | + } | |
150 | 151 | } |
151 | 152 | |
152 | 153 | |
... | ... | @@ -654,10 +655,15 @@ class MaterielsControllerTest extends General { |
654 | 655 | // On doit pouvoir accéder à la page une fois authentifié |
655 | 656 | $this->authAs($role); |
656 | 657 | |
658 | + $do1=1; | |
659 | + $do2=1; | |
660 | + $do3=1; | |
661 | + $do4=1; | |
662 | + | |
657 | 663 | // 1) RULE MATERIEL.COPY.1 : |
658 | 664 | // Copie d'un matos (CREATED) à l'IDENTIQUE (tel quel sans rien changer, |
659 | 665 | // sauf ce qui changera automatiquement: id, numlab) |
660 | - $this->_testMatCopy(1, true, $role, 1, [], 'TEST-2014-0001'); | |
666 | + if ($do1) $this->_testMatCopy(1, true, $role, 1, [], 'TEST-2014-0001'); | |
661 | 667 | |
662 | 668 | // 2) RULE MATERIEL.COPY.2 : |
663 | 669 | // Copie d'un matos (CREATED) en changeant quelques données |
... | ... | @@ -676,17 +682,19 @@ class MaterielsControllerTest extends General { |
676 | 682 | //'email_responsable' => 'Jacques.Utilisateur@irap.omp.eu', |
677 | 683 | //'fournisseur_id' => 2 |
678 | 684 | ]; |
679 | - $this->_testMatCopy(2, true, $role, 1, $modified_data, 'TEST-2016-0015'); | |
685 | + if ($do2) $this->_testMatCopy(2, true, $role, 1, $modified_data, 'TEST-2016-0015'); | |
680 | 686 | |
681 | 687 | // 3) RULE MATERIEL.COPY.3 : |
688 | + // Impossible de copier un matos de statut superieur à CREATED (même pas pour SUPERADMIN) | |
689 | + $do3 && $this->_testMatCopy(3, false, $role, 3); | |
682 | 690 | // Impossible de copier un matos de statut superieur à CREATED (sauf pour SUPERADMIN) |
683 | - $this->_testMatCopy(3, $role=="SUPER", $role, 3); | |
691 | + //if ($do3) $this->_testMatCopy(3, $role=="SUPER", $role, 3); | |
684 | 692 | |
685 | 693 | // 4) RULE MATERIEL.COPY.4 : |
686 | 694 | // Pour un USER: Impossible de copier un matos CREATED dont je ne suis pas propriétaire |
687 | 695 | // Pour les autres, c'est ok |
688 | 696 | //$this->_testMatCopy(4, !in_array($role, ["USER", "USER_from_ldap"]), $role, 2); |
689 | - $this->_testMatCopy(4, !$this->USER_IS_USER(), $role, 2); | |
697 | + if ($do4) $this->_testMatCopy(4, !$this->USER_IS_USER(), $role, 2); | |
690 | 698 | |
691 | 699 | } |
692 | 700 | |
... | ... | @@ -714,7 +722,7 @@ class MaterielsControllerTest extends General { |
714 | 722 | |
715 | 723 | // APRES add |
716 | 724 | $this->_checkNbMaterielInIndexViewIs($COPIED, $role, $nbmat, $designation, $num_inventaire); |
717 | - /* | |
725 | +/* | |
718 | 726 | $this->get('/materiels/index'); |
719 | 727 | // VOIR LE HTML DE LA PAGE WEB |
720 | 728 | //var_dump($this->_getBodyAsString()); | ... | ... |