Commit 53f3e42a authored by David Surville's avatar David Surville
Browse files

Interface de gestion des rôles et périmètres de l'utilisateur (wip)

parent ede480a5
Loading
Loading
Loading
Loading
+45 −0
Changes for config/merged/utilisateur.config.php: 45 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -8,6 +8,8 @@ use UnicaenUtilisateur\Form\User\UserFormFactory;
use UnicaenUtilisateur\Form\User\UserHydrator;
use UnicaenUtilisateur\Form\User\UserHydratorFactory;
use UnicaenUtilisateur\Form\User\UserRechercheForm;
use UnicaenUtilisateur\Form\User\UserRoleForm;
use UnicaenUtilisateur\Form\User\UserRoleFormFactory;
use UnicaenUtilisateur\Provider\Privilege\UtilisateurPrivileges;
use UnicaenUtilisateur\Service\Role\RoleService;
use UnicaenUtilisateur\Service\Role\RoleServiceFactory;
@@ -50,6 +52,7 @@ return [
                    'action' => [
                        'supprimer',
                        'ajouter',
                        'modifier',
                    ],
                    'privileges' => [
                        UtilisateurPrivileges::UTILISATEUR_AJOUTER,
@@ -68,6 +71,8 @@ return [
                    'controller' => UtilisateurController::class,
                    'action' => [
                        'ajouter-role',
                        'lister-role',
                        'recharger-role',
                        'supprimer-role',
                    ],
                    'privileges' => [
@@ -111,6 +116,19 @@ return [
                            ],
                        ],
                    ],
                    'modifier' => [
                        'type'          => Segment::class,
                        'options'       => [
                            'route'       => '/modifier/:utilisateur',
                            'defaults'    => [
                                'controller' => UtilisateurController::class,
                                'action' => 'modifier',
                            ],
                            'constraints' => [
                                'utilisateur' => '\d+',
                            ],
                        ],
                    ],
                    'exporter' => [
                        'type'          => Literal::class,
                        'options'       => [
@@ -144,6 +162,32 @@ return [
                            ],
                        ],
                    ],
                    'lister-role' => [
                        'type'          => Segment::class,
                        'options'       => [
                            'route'       => '/lister-role/:utilisateur',
                            'defaults'    => [
                                'controller' => UtilisateurController::class,
                                'action' => 'lister-role',
                            ],
                            'constraints' => [
                                'utilisateur' => '\d+',
                            ],
                        ],
                    ],
                    'recharger-role' => [
                        'type'          => Segment::class,
                        'options'       => [
                            'route'       => '/recharger-role/:utilisateur',
                            'defaults'    => [
                                'controller' => UtilisateurController::class,
                                'action' => 'recharger-role',
                            ],
                            'constraints' => [
                                'utilisateur' => '\d+',
                            ],
                        ],
                    ],
                    'supprimer-role' => [
                        'type'          => Segment::class,
                        'options'       => [
@@ -208,6 +252,7 @@ return [
        ],
        'factories' => [
            UserForm::class => UserFormFactory::class,
            UserRoleForm::class => UserRoleFormFactory::class,
        ],
    ],

+67 −31
Changes for src/UnicaenUtilisateur/Controller/UtilisateurController.php: 67 added lines, 31 removed lines.
Original line number Diff line number Diff line
@@ -67,11 +67,12 @@ class UtilisateurController extends AbstractActionController
    public function indexAction()
    {
        $roles = $this->roleService->findAll();
        $form = $this->userRechercheForm;
        $userRechercheForm = $this->userRechercheForm;
        $userRoleForm = $this->userRoleForm;

        if ($data = $this->params()->fromPost()) {
            $form->setData($data);
            if ($form->isValid()) {
            $userRechercheForm->setData($data);
            if ($userRechercheForm->isValid()) {
                list($source, $id) = explode('||', $data['utilisateurId']);

                switch ($source) {
@@ -104,33 +105,26 @@ class UtilisateurController extends AbstractActionController
        }

        $utilisateurId = $this->params()->fromQuery("id");
        $utilisateur = null;
        $rolesAttribues = [];
        $rolesDisponibles = [];
        if ($utilisateurId !== null AND $utilisateurId !== "") {
            $utilisateur = $this->userService->find($utilisateurId);
            if($utilisateur instanceof UserInterface) {
                $rolesAttribues = $utilisateur->getRoles()->toArray();
                $rolesDisponibles = array_diff($roles, $rolesAttribues);
            }
        $utilisateur = $utilisateurId ? $this->userService->find($utilisateurId) : null;
        if($utilisateur) {
            $roleOptions = $this->roleService->getListForSelect($this->roleService->findAvailableByUser($utilisateur));
            $userRoleForm->setAttribute('action', $this->url()->fromRoute('unicaen-utilisateur/ajouter-role', ['utilisateur' => $utilisateur->getId()], [], true));
            $userRoleForm->get('role')->setValueOptions($roleOptions);
        }

        // TODO recupérer le provider qui va bien ...
        return new ViewModel([
            'title' => "Gestion des utilisateurs",
            'form' => $form,
            'userRechercheForm' => $userRechercheForm,
            'userRoleForm' => $userRoleForm,
            'utilisateur' => $utilisateur,
            'roles' => $roles,
            'rolesAttribues' => $rolesAttribues,
            'rolesDisponibles' => $rolesDisponibles,
            'rolesAutomatiques' => ($this->identityProvider !== null) ? $this->identityProvider->computeRolesAutomatiques($utilisateur) : [],
//            'rolesAutomatiques' => ($this->identityProvider !== null) ? $this->identityProvider->computeRolesAutomatiques($utilisateur) : [],
        ]);
    }

    public function ajouterAction()
    {
        $utilisateur = $this->userService->getEntityInstance();
        $form = $this->getUserForm();
        $form = $this->userForm;
        $form->setAttribute('action', $this->url()->fromRoute('unicaen-utilisateur/ajouter', [], [], true));
        $form->bind($utilisateur);

@@ -152,35 +146,76 @@ class UtilisateurController extends AbstractActionController
        return compact('title', 'form');
    }

    public function ajouterRoleAction()
    public function modifierAction()
    {
        $user = $this->userService->getRequestedUser($this);
        $form = $this->userRoleForm;
        $form->setAttribute('action', $this->url()->fromRoute('unicaen-utilisateur/ajouter', ['utilisateur' => $user->getId()], [], true));
        $form->bind($user);
        $utilisateur = $this->userService->getRequestedUser($this);
        $form = $this->userForm;
        $form->setAttribute('action', $this->url()->fromRoute('unicaen-utilisateur/modifier', ['utilisateur' => $utilisateur->getId()], [], true));
        $form->getInputFilter()->get('password')->setRequired(false);
        $form->getInputFilter()->get('password2')->setRequired(false);
        $form->bind($utilisateur);

        if ($data = $this->params()->fromPost()) {
            foreach(['password', 'password2'] as $input) {
                if(empty($data[$input])) {
                    unset($data[$input]);
                }
            }
            $form->setData($data);
            if ($form->isValid()) {
                try {
                    $this->userService->addRole();
                    $this->flashMessenger()->addSuccessMessage(sprintf("Rôle <strong>%s</strong> créé avec succès.", $perimetre->getLibelle()));
                    $this->userService->updateLocal($utilisateur, $data['password']);
                    $this->flashMessenger()->addSuccessMessage(sprintf("Utilisateur <strong>%s</strong> modifié avec succès.", $utilisateur->getDisplayName()));
                } catch (Exception $e) {
                    $this->flashMessenger()->addErrorMessage(sprintf("Une erreur est survenu lors de la création de la valeur de périmètre <strong>%s</strong>.", $perimetre->getLibelle()));
                    $this->flashMessenger()->addErrorMessage(sprintf("Une erreur est survenu lors de la modification de l'utilisateur <strong>%s</strong>.", $utilisateur->getDisplayName()));
                }
            }
        }

        $view = new ViewModel();
        $view->setTemplate('unicaen-privilege/perimetre/template/form-perimetre');
        $view->setTemplate('unicaen-utilisateur/utilisateur/template/form-user');
        $view->setVariables([
            'title' => "Ajout d'une nouvelle valeur de périmètre",
            'title' => "Modification de l'utilisateur",
            'form' => $form,
        ]);

        return $view;
    }

    public function listerRoleAction()
    {
        $utilisateur = $this->userService->getRequestedUser($this);
        return compact('utilisateur');
    }

    public function rechargerRoleAction()
    {
        $utilisateur = $this->userService->getRequestedUser($this);
        $roleOptions = $this->roleService->getListForSelect($this->roleService->findAvailableByUser($utilisateur));

        return new JsonModel($roleOptions);
    }

    public function ajouterRoleAction()
    {
        $utilisateur = $this->userService->getRequestedUser($this);
        $roleId = $this->params()->fromPost('role');
        $role = $this->roleService->find($roleId);

        if ($utilisateur !== null && $role !== null) {
            $this->userService->addRole($utilisateur, $role);
            $result = true;
        }

        return new JsonModel([
            "nb" => $utilisateur->getFullRoles()->count()+1,
            "result" => $result ?: false,
            "message" => $result
                ? sprintf("Ajout du rôle <strong>%s</strong> à l'utilisateur <strong>%s</strong>.", $role->getLibelle(), $utilisateur->getDisplayName())
                : sprintf("Erreur lors de l'ajout du rôle <strong>%s</strong> à l'utilisateur <strong>%s</strong>.", $role->getLibelle(), $utilisateur->getDisplayName())
        ]);
    }

    public function supprimerRoleAction()
    {
        $utilisateur = $this->userService->getRequestedUser($this);
@@ -193,10 +228,11 @@ class UtilisateurController extends AbstractActionController
        }

        return new JsonModel([
            "nb" => $utilisateur->getFullRoles()->count()+1,
            "result" => $result ?: false,
            "message" => $result
                ? sprintf("Suppression du rôle <strong>%s</strong> à l'utilisateur <strong>%s</strong>.", $role->getLibelle(), $utilisateur->getDisplayName())
                : sprintf("Erreur lors de la suppression du rôle <strong>%s</strong> à l'utilisateur <strong>%s</strong>.", $role->getLibelle(), $utilisateur->getDisplayName())
                ? sprintf("Suppression du rôle <strong>%s</strong> de l'utilisateur <strong>%s</strong>.", $role->getLibelle(), $utilisateur->getDisplayName())
                : sprintf("Erreur lors de la suppression du rôle <strong>%s</strong> de l'utilisateur <strong>%s</strong>.", $role->getLibelle(), $utilisateur->getDisplayName())
        ]);
    }

+3 −1
Changes for src/UnicaenUtilisateur/Controller/UtilisateurControllerFactory.php: 3 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -3,10 +3,10 @@
namespace UnicaenUtilisateur\Controller;

use Application\Provider\IdentityProvider;
use Doctrine\ORM\EntityManager;
use Interop\Container\ContainerInterface;
use UnicaenUtilisateur\Form\User\UserForm;
use UnicaenUtilisateur\Form\User\UserRechercheForm;
use UnicaenUtilisateur\Form\User\UserRoleForm;
use UnicaenUtilisateur\Service\RechercheIndividu\RechercheIndividuServiceInterface;
use UnicaenUtilisateur\Service\Role\RoleService;
use UnicaenUtilisateur\Service\User\UserService;
@@ -34,6 +34,7 @@ class UtilisateurControllerFactory
        $userService = $container->get(UserService::class);
        $userForm = $container->get('FormElementManager')->get(UserForm::class);
        $userRechercheForm = $container->get('FormElementManager')->get(UserRechercheForm::class);
        $userRoleForm = $container->get('FormElementManager')->get(UserRoleForm::class);

        // services de recherche d'un individu : application, ldap, octopus,...
        $rechercheServices = [];
@@ -58,6 +59,7 @@ class UtilisateurControllerFactory
        $controller->setIdentityProvider($identityProvider);
        $controller->setUserForm($userForm);
        $controller->setUserRechercheForm($userRechercheForm);
        $controller->setUserRoleForm($userRoleForm);

        return $controller;
    }
+45 −19
Changes for src/UnicaenUtilisateur/Form/User/UserForm.php: 45 added lines, 19 removed lines.
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@ use Zend\Form\Element\Password;
use Zend\Form\Element\Text;
use Zend\Form\Form;
use Zend\InputFilter\Factory;
use Zend\Validator\Callback;
use Zend\Validator\Identical;
use Zend\Validator\NotEmpty;
use Zend\Validator\Regex;
@@ -42,7 +43,7 @@ class UserForm extends Form
        //nom afficher
        $this->add([
            'type' => Text::class,
            'name' => 'displayname',
            'name' => 'displayName',
            'options' => [
                'label' => "Nom :",
                'label_attributes' => [
@@ -74,7 +75,7 @@ class UserForm extends Form
            'type' => Password::class,
            'name' => 'password',
            'options' => [
                'label' => "Mot de passe :",
                'label' => "Mot de passe local :",
                'label_attributes' => [
                    'class' => 'required',
                ],
@@ -89,7 +90,7 @@ class UserForm extends Form
            'type' => Password::class,
            'name' => 'password2',
            'options' => [
                'label' => "Vérification du mot de passe :",
                'label' => "Confirmation du mot de passe local :",
                'label_attributes' => [
                    'class' => 'required',
                ],
@@ -129,20 +130,28 @@ class UserForm extends Form
                        ],
                    ],
                    [
                        'name' => NoObjectExists::class,
                        'name' => Callback::class,
                        'options' => [
                            'object_manager' => $this->getEntityManager(),
                            'object_repository' => $this->userService->getRepo(),
                            'fields'   => 'username',
                            'messages' => [
                                NoObjectExists::ERROR_OBJECT_FOUND => "L'identifiant de connexion est déjà utilisé dans l'application.",
                                Callback::INVALID_VALUE => "L'identifiant de connexion est déjà utilisé dans l'application.",
                            ],
                            'callback' => function ($value, $context = []) {
                                $user = $this->userService->findByUsername($value);
                                if(!$user) {
                                    return true;
                                }
                                elseif($this->getObject()->getId() != null) { // modification
                                    return strtoupper($this->getObject()->getUsername()) === strtoupper($value);
                                }
                                return false;
                            },
                            'break_chain_on_failure' => true,
                        ],
                    ],
                    ]
                ],
            ],

            'displayname'   => [
            'displayName'   => [
                'required' => true,
                'validators' => [
                    [
@@ -170,16 +179,24 @@ class UserForm extends Form
                        ],
                    ],
                    [
                        'name' => NoObjectExists::class,
                        'name' => Callback::class,
                        'options' => [
                            'object_manager' => $this->getEntityManager(),
                            'object_repository'   => $this->userService->getRepo(),
                            'fields'   => 'email',
                            'messages' => [
                                NoObjectExists::ERROR_OBJECT_FOUND => "L'email est déjà utilisé dans l'application.",
                                Callback::INVALID_VALUE => "L'email est déjà utilisé dans l'application.",
                            ],
                            'callback' => function ($value, $context = []) {
                                $user = $this->userService->findByEmail($value);
                                if(!$user) {
                                    return true;
                                }
                                elseif($this->getObject()->getId() != null) { // modification
                                    return strtoupper($this->getObject()->getEmail()) === strtoupper($value);
                                }
                                return false;
                            },
                            'break_chain_on_failure' => true,
                        ],
                    ],
                    ]
                ],
            ],

@@ -198,9 +215,9 @@ class UserForm extends Form
                    [
                        'name' => Regex::class,
                        'options' => [
                            'pattern' => '/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*_])(?=.{8,})/',
                            'pattern' => '/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[' . preg_quote('_!@#$%-+=<>()[]|:;,.?~&') . '])(?=.{8,})/',
                            'messages' => [
                                Regex::NOT_MATCH => "Le mot de passe choisi est trop simple. <br/> <b><u>N.B.:</u></b> Le mot de passe doit avoir une longueur minimale de 8 caractères avec au moins : <ul> <li>une majuscule ;</li> <li>une minuscule ;</li> <li>un chiffre ;</li> <li>un caractère spécial.</li></ul>",
                                Regex::NOT_MATCH => "Le mot de passe choisi est trop simple.<br/> Il doit faire au moins 8 caractères et contenir <ul> <li>une majuscule ;</li> <li>une minuscule ;</li> <li>un chiffre ;</li> <li>un caractère spécial.</li></ul>",
                            ],
                            'break_chain_on_failure' => true,
                        ],
@@ -220,7 +237,16 @@ class UserForm extends Form
                            'break_chain_on_failure' => true,
                        ],
                    ],
                    new Identical('password'),
                    [
                        'name' => Identical::class,
                        'options' => [
                            'token' => 'password',
                            'messages' => [
                                Identical::NOT_SAME => "Les deux mots de passe ne correspondent pas."
                            ],
                            'break_chain_on_failure' => true,
                        ],
                    ],
                ],
            ],
        ]));
+4 −1
Changes for src/UnicaenUtilisateur/Form/User/UserRechercheForm.php: 4 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -15,7 +15,10 @@ class UserRechercheForm extends Form
{
    public function init()
    {
        $this->setAttribute('method', 'post');
        $this->setAttributes([
            'method' => 'post',
            'id' => 'form-user-recherche',
        ]);

        $this->add([
            'type' => Element\Hidden::class,
Loading