Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony 4] Gerer les autotisations

17 juillet 2019 à 21:01:21

Salut les amis voilà je suis confronter à une problématique

Voici mon code :

security:
    encoders:
        App\Entity\User:
            algorithm: bcrypt
            cost: 12


    role_hierarchy:
        ROLE_ENFANT:
        ROLE_ENSEIGNANT: ROLE_ENFANT
        ROLE_ADULTE:
        ROLE_PARENT:        [ROLE_ADULTE, ROLE_PARENT]
        ROLE_ANIMATEUR:     [ROLE_ADULTE, ROLE_ANIMATEUR]
        ROLE_PROFESSEUR:    [ROLE_ADULTE, ROLE_ANIMATEUR]
        ROLE_PARTENAIRE:    [ROLE_ADULTE, ROLE_PARTENAIRE]
        ROLE_ADMIN:         ROLE_ADMIN
        ROLE_SUPER_ADMIN:   [
                                ROLE_ENFANT,
                                ROLE_ENSEIGNANT,
                                ROLE_ADULTE,
                                ROLE_ADMIN,
                                ROLE_PARENT,
                                ROLE_ANIMATEUR,
                                ROLE_PARTENAIRE,
                                ROLE_PROFESSEUR,
                                ROLE_ALLOWED_TO_SWITCH
                            ]

    # https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
    providers:
        from_database:
            entity:
                class: App\Entity\User
                property: username

    firewalls:

        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            form_login:
                always_use_default_target_path: true
                login_path: login
                check_path: login
                default_target_path: account

            logout:
                path: /logout
                target: /
            anonymous: true
            provider : from_database
            guard:
                authenticators:
                    - App\Security\LoginFormAuthenticator

    access_control:
        - { path: '^/admin', roles: ROLE_ADMIN }
        - { path: '^/supervision', roles: ROLE_SUPER_ADMIN }
        - { path: '^/partenaire', roles: ROLE_PARTENAIRE }
        - { path: '^/animateur', roles: ROLE_ANIMATEUR }
        - { path: '^/parent', roles: ROLE_PARENT }
        - { path: '^/enseignant', roles: ROLE_ENSEIGNANT }
        - { path: '^/e', roles: ROLE_ENFANT }
        - { path: '^/a', roles: ROLE_ADULTE }

Je suis en train de mettre en place un site de soutien et de formation.

J'ai défini les rôles ci-dessus.

Je souhaite maintenant associer un rôle à chaque utilisateur.

  • Comment dois-je faire, sans doute que je dois stocker ce rôle dans la bdd ?
  • Si je dois stocker ce rôle dans la bdd dans tel table dois-je mettre ce rôle ?
  • Ou est-ce que je peux le mettre dans n'importe quelle table ?

Je souhaite aussi que lors de la connexion au site (Authentification), je puisse récupérer le rôle de l'utilisateur qui souhaite se connécter.

Ainsi si l'utilisateur a le role partenaire par exemple et bien lorsqu'il se connecte et que la connexion réussis, qu'il ne soit pas redirigé sur la page qui a la route "account" mais sur une autre page

  • Comment je fais ça ?
  • Partager sur Facebook
  • Partager sur Twitter
17 juillet 2019 à 21:28:55

> Comment dois-je faire, sans doute que je dois stocker ce rôle dans la bdd ?

Oui

> Si je dois stocker ce rôle dans la bdd dans tel table dois-je mettre ce rôle ?

A mon avis le mieux c'est sur le User directement

> Ou est-ce que je peux le mettre dans n'importe quelle table ?

Ca dépend de ton utilisation, mais si une personne n'a que des rôles comme tu les as définis ici sur le User c'est bien.

> Ainsi si l'utilisateur a le role partenaire par exemple et bien lorsqu'il se connecte et que la connexion réussis, qu'il ne soit pas redirigé sur la page qui a la route "account" mais sur une autre page

Dans ton Guard, il y a probablement une méthode onAuthenticationSuccess qui peut te permettre ça.

  • Partager sur Facebook
  • Partager sur Twitter
17 juillet 2019 à 21:46:17

Merci beaucoup, effectivement j'ai cette méthode

Mais j'ai une autre question pourquoi dans mon entité User j'ai que ces méthodes là

    public function getRoles(): ?array
    {
        if (empty($this->roles)) {
            return ['ROLE_INVITE'];
        }
        return $this->roles;
    }
    public function setRoles(array $roles): self
    {
        $this->roles = $roles;

        return $this;
    }

Je n'ai pas de méthode addRole()

ou removeRole()

Pourquoi j'ai que ces deux méthodes ?

Ou je dois les créer moi-même à la main ?

-
Edité par ZarAb 18 juillet 2019 à 2:06:43

  • Partager sur Facebook
  • Partager sur Twitter
18 juillet 2019 à 8:32:34

Pourquoi tu les as ? Ca je ne sais pas, c'est toi qui a écrit le code (ou le maker bundle peut-être). La seule requise est getRoles(), qui doit renvoyer un tableau.

Le addRole()/removeRole() n'est utile que pour les collections normalement.

  • Partager sur Facebook
  • Partager sur Twitter
18 juillet 2019 à 11:25:22

effectivement j'ai compris la source de mon erreur !
  • Partager sur Facebook
  • Partager sur Twitter