THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline


Bon, maintenant, je m'attaque aux authorisations.

Voilà un bout de code qui marche :

        $isGranted = $this->securityContext->isGranted(
            [1],
            ["admin.artabanmarketplace.sellers"],
            [ArtabanMarketplace::getModuleCode()],
            [AccessManager::VIEW]
        );

Le premier 1 est l'identifiant du rôle ( profile ) qui est enregistré dans la base. Mais j'aimerais que ça marche avec le champ "code" enregistré dans la table "profil". Dans mon cas, "Vendeur".

J'ai essayé

        $isGranted = $this->securityContext->isGranted(
            [ "Vendeur"],
            ["admin.artabanmarketplace.sellers"],
            [ArtabanMarketplace::getModuleCode()],
            [AccessManager::VIEW]
        );

Mais ça n'a pas marché...

Une piste ?

Offline


Bon, apparement le code ci-dessous ne marche pas bien

        $isGranted = $this->securityContext->isGranted(
            [1],
            ["admin.artabanmarketplace.sellers"],
            [ArtabanMarketplace::getModuleCode()],
            [AccessManager::VIEW]
        );

Comment faire pour qu'un code comme ci-dessous fonctionne ?

        $isGranted = $this->securityContext->isGranted(
            [ "Vendeur"],
            ["admin.artabanmarketplace.sellers"],
            [ArtabanMarketplace::getModuleCode()],
            [AccessManager::VIEW]
        );

Une piste ?

Offline


En fait, cette méthode vérifie le role de l'utilisateur couramment connecté, en appelant la méthode getRole() de l'interface UserInterface.

Pour l'instant, seuls deux classes implémentent cette interface : \Thelia\Model\Customer et Thelia\Model\Admin. La 1ere renvoie "CUSTOMER" et la seconde "ADMIN".
Ça signifie que les deux seuls rôles définis dans Thelia 2 sont ADMIN et CUSTOMER.

Si tu veux implémenter un nouveau rôle, il te faudrait implémenter une nouvelle classe utilisateur (qui extends \Thelia\Model\Customer, par exemple), dont la méthode getRole() va renvoyer "Vendeur"et t'assurer que c'est bien une instance de cette classe qui est placée en session lors du login, sans doute en créant ton propre contrôleur de login, sur le modèle de \Front\Controller\CustomerController::loginAction()

Ce système est plutôt mal fichu (c'est moi qui l'ai fait, mea culpa), on ne peut pas injecter son propre CustomerUserProvider, tout est assez rigide. Il faudra étudier un assouplissement.


OpenStudio Toulouse

Offline


Merci de ta réponse.
En fait, il ne vaut pas mieux étendre la class Admin pour pouvoir utiliser les droits assignables aux vendeurs ?
J'ai créé un objet Seller que je pense associer à un admin ayant le profil "Vendeur".
Mais peut être que plutôt que d'avoir un objet Seller associé à un objet Admin, il vaut mieux faire un objet Seller qui est un objet Admin. Mais on va perdre tout ce qui concerne la gestion des droits via l'interface graphique, non ? Et en plus il faudra aussi refaire le login si j'ai bien compris ?

Offline


Tu étends (ou écrit) la classe que tu veux, du moment qu'elle implémente UserInterface

Il n'y aura rien à ré-ecrire de spécial, mis à part la méthode qui place l'instance de UserInterface en session, puisque c'est de la session qu'on sort l'objet à qui on demande le rôle. à priori  \Front\Controller\CustomerController::loginAction()

Tu ne perds pas les autorisations, car la méthode getRoles() renvoie un tableau :

    /**
     * Returns the roles granted to the user.
     *
     * <code>
     * public function getRoles()
     * {
     *     return array('USER');
     * }
     * </code>
     *
     * @return Role[] The user roles
     */
    public function getRoles();

Du coup, c'est possible de renvoyer: [ new Role('ADMIN'), new Role('Vendeur')]


OpenStudio Toulouse

Offline


Merci.
Je regarde dés que je peux.