IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

autorisations: seul l'utilisateur ou administrateur accède au profil


Sujet :

Symfony PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 274
    Points : 112
    Points
    112
    Par défaut autorisations: seul l'utilisateur ou administrateur accède au profil
    Bonjour,

    je suis en train de configurer les autorisations pour mon application et comme écris dans le titre je souhaite:
    - qu'un utilisateur puisse accéder à son profil et uniquement au sien.
    - qu'un administrateur puisse accéder à tous les profils.

    dans mon security.yaml:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    access_control:
             - { path: ^/admin, roles: ROLE_ADMIN }
             - { path: ^/profile, roles: ROLE_COLL }
     
    role_hierarchy:
            ROLE_ADMIN: ROLE_COLL

    Un utilisateur enregistré est soit un collaborateur ou un administrateur

    et dans mon controller:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #[Route('/profile/user/{id}', name: 'app_user_read')]
        public function read(User $user)
        {
            return $this->render('user/read.html.twig', compact('user'));
        }

    La solution à laquelle je pense : comparer l' id appelé avec celui de l'utilisateur connecté: if ( $this->getUser()->getId() == $user->getId() ) {}
    et afficher un texte si la condition n'est pas vérifiée. Mais je ne trouve pas ça génial !

    J'ai créé un fichier ( surchargé ) la page d'erreur 403 de symfony, je voudrais afficher cette page au cas ou l'utilisateur tente d'accéder à un profil qui n'est pas le sien !
    ( en cliquant sur un lien ou bien en taper l'url dans la barre de recherche du navigateur ).
    Pour l'instant, cette page s'affiche lorsqu'un utilisateur (ROLE_COLL) est connecté et veut accéder à une route réservé à l'administrateur.

    Une redirection, ça peut marcher, mais je pense que c'est pas la bonne façon de faire.

    Voilà,
    Cordialement,

    Laurent.

  2. #2
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 274
    Points : 112
    Points
    112
    Par défaut
    Alors après lecture de documentation j'en suis arrivé à ça:

    j'ai utiliser un voter!
    Ça me permet de mettre cette ligne de code dans mon contrôler $this->denyAccessUnlessGranted('view', $user);Cela rendra une page d'accès refusé et affichera la page error403.html.twig que j'ai surchargée...

    Bien sûr j'ai suivi de très près la doc pour le voter
    C'est dans le voter du coup que je vérifie si l'utilisateur qui demande la page et administrateur ou si la page est celle de son profil.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    class UserProfileVoter extends Voter
    {
     
        const USER_VIEW = 'view';
        const USER_EDIT = 'edit';
     
        protected function supports(string $attribute, $subject): bool
        {
            // replace with your own logic
            // https://symfony.com/doc/current/security/voters.html
            return in_array($attribute, [self::USER_VIEW, self::USER_EDIT])
                && $subject instanceof \App\Entity\User;
        }
     
        protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
        {
            $currentUser = $token->getUser();
            // if the user is anonymous, do not grant access
            if (!$currentUser instanceof UserInterface) {
                return false;
            }
     
            if (!$subject instanceof User) {
                return false;
            }
     
            $user = $subject;
     
            // ... (check conditions and return true to grant permission) ...
            switch ($attribute) {
                case self::USER_VIEW:
                    // logic to determine if the user can VIEW
                    return $this->canView($currentUser, $user);
     
                case self::USER_EDIT:
                    // logic to determine if the user can EDIT
                    return $this->canEdit($currentUser, $user);
            }
        }
     
        private function canView(User $currentUser, User $user)
        {
            if ($this->canEdit($currentUser, $user)) {
                return true;
            } else {
                return false;
            }
        }
     
        private function canEdit(User $currentUser, User $user):bool
        {
            //dd($currentUser->getRoles()[0] === "ROLE_ADMIN");
            return ($currentUser->getId() === $user->getId() || $currentUser->getRoles()[0] === "ROLE_ADMIN");
        }
    }

    Donc voilà, je ne sais pas si c'est la seule manière de faire ou s'il y a mieux...Mais pour l'instant, ça me convient !

  3. #3
    Expert éminent sénior

    Avatar de -Nikopol-
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2013
    Messages
    2 174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2013
    Messages : 2 174
    Points : 11 289
    Points
    11 289
    Billets dans le blog
    5
    Par défaut
    fais quand même attention à ceci : $currentUser->getRoles()[0] === "ROLE_ADMIN". Si les rôles sont juste admin et user pas de soucis vu que le rôle user est ajouté dynamiquement.
    En revanche, comme ça à l'air d’être ton cas au vu de l'autre discussion, lors de l'ajout ou la suppression des rôles, rien ne te certifie que le rôle admin sera toujours à l'index 0. J'utiliserai plutôt un str_contains.

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 274
    Points : 112
    Points
    112
    Par défaut
    bonjour,

    str_contains() ça fonctionne pour les tableaux ?? Si j'ai bien compris (je doute ) ça permet de rechercher une chaine de caractères qui se trouve ( ou pas ) dans une autre chaine...
    Ou alors je n'ai pas compris. Je veux bien avoir un peu plus d'explication la-dessus !
    Je ne vois pas comment m'en servir dans ce cas précis.

    Nous sommes bien d'accord que $currentUser->getRoles() retourne un tableau de roles.
    Du coup, je vérifierai si la valeur "ROLE_ADMIN3 se trouve dans le tableau: plutôt un in_array

  5. #5
    Expert éminent sénior

    Avatar de -Nikopol-
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2013
    Messages
    2 174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2013
    Messages : 2 174
    Points : 11 289
    Points
    11 289
    Billets dans le blog
    5
    Par défaut
    yes j'ai parlé un peu vite mais tu as compris le principe.

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 274
    Points : 112
    Points
    112
    Par défaut
    Ouf !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Accès au registre verrouillé pour un seul compte utilisateur
    Par Virtualité dans le forum Windows XP
    Réponses: 2
    Dernier message: 12/12/2007, 18h15
  2. Mode Utilisateur ou Administrateur
    Par alen dans le forum MFC
    Réponses: 1
    Dernier message: 25/05/2007, 13h58
  3. ajouter un utilisateur comme administrateur d'une BDD Interbase
    Par passion_info dans le forum Bases de données
    Réponses: 1
    Dernier message: 30/11/2006, 08h42
  4. lancer serveur FB en tant qu'utilisateur non administrateur
    Par didier.cabale dans le forum Débuter
    Réponses: 1
    Dernier message: 01/03/2005, 18h05
  5. Savoir si l'utilisateur est administrateur
    Par Don ViP dans le forum Windows
    Réponses: 2
    Dernier message: 26/04/2004, 13h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo