Ajouter ROLE depuis le formulaire d'inscruption

Par m.deye, il y a 7 ans


Bonjour,

J'ai un formulaire d'inscruption qui doit permettre à un administrateur d'enrregistrer un nouvau utilisateur et de lui assigenr un role

Ce que je fais

Mon class User.php

<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Validator\Constraints\EqualTo; use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\Security\Core\User\UserInterface; /** * @ORM\Entity(repositoryClass="App\Repository\UserRepository") */ class User implements UserInterface { /** * @ORM\Id() * @ORM\GeneratedValue() * @ORM\Column(type="integer") */ private $id; /** * @ORM\Column(type="string", length=255) */ private $name; /** * @ORM\Column(type="string", length=255) * @Assert\EqualTo(propertyPath= "password_confirme") */ private $password; /** * @Assert\EqualTo(propertyPath= "password", message="Vous n'avez pas taper le meme mot de passe") */ public $password_confirme; /** * @ORM\Column(type="string", length=255) */ private $email; /** * @ORM\Column(type="string", nullable=true, length=255) */ private $role; public function getId(): ?int { return $this->id; } public function getName(): ?string { return $this->name; } public function setName(string $name): self { $this->name = $name; return $this; } public function getPassword(): ?string { return $this->password; } public function setPassword(string $password): self { $this->password = $password; return $this; } public function getEmail(): ?string { return $this->email; } public function setEmail(string $email): self { $this->email = $email; return $this; } public function getRole() { return $this->role; } public function setRole($role) { $this->role = $role; return $this; } public function getUserName(){} public function eraseCredentials(){} public function getSalt(){} public function getRoles(){ return [$this->role]; } }

UserType.php

class UserType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('email') ->add('name') ->add('password', PasswordType::class) ->add('password_confirme', PasswordType::class) ->add('role', ChoiceType::class, [ 'label' =>'Role', 'placeholder'=>'', 'choices' =>[ 'Administrateur'=>'ROLE_ADMIN', 'Traiteur ' =>'ROLE_SOUSCOMMISSION', ], ]) ; }

L'action inscription de mon controller UserController.php

/** * @Route("/inscription", name="security") */ public function inscription(Request $request, ObjectManager $manager, UserPasswordEncoderInterface $encoder) { $user= new User(); $form = $this->createForm(UserType::class, $user); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $hash = $encoder->encodePassword($user, $user->getPassword()); $user->setPassword($hash); $manager->persist($user); $manager->flush(); return $this->redirectToRoute('security_login'); } return $this->render('security/inscrie.html.twig', [ 'form' => $form->createView(), ]); }

Security.yaml

security: encoders: App\Entity\User: algorithm: bcrypt # https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers providers: in_memory: { memory: ~ } in_database: entity: class: App\Entity\User property: name role_hierarchy: # Un admin hérite des droits d'utilisateur et de souscommission ROLE_ADMIN: ROLE_SOUSCOMMISSION # On garde ce rôle superadmin, il nous resservira par la suite #ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] firewalls: dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false main: anonymous: true provider: in_database form_login: login_path: security_login check_path: security_login logout: path: security_logout target: home # activate different ways to authenticate # http_basic: true # https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate # form_login: true # https://symfony.com/doc/current/security/form_login_setup.html # Easy way to control access for large sections of your site # Note: Only the *first* access control that matches will be used access_control: - { path: ^/admin, roles: ROLE_ADMIN } - { path: ^/admin/traitement, roles: ROLE_SOUSCOMMISSION }

Ce que je veux

Je veux si un nouveau utilisateur connecte avec son, le système lui rédirige vers la source demandée.
J'arrive à enrregistrer un nouveau utilisateur au noveau de la base avec un role. Mais lorsque je me connect et je t'ante d'accéder au source le système m'affich une erreur.
Je veux votre aide et je sais il ya des bundels pour gérer l'authentification, mais j'en veu pas l'utilser

Ce que j'obtiens

Access Denied.

5 réponses

Digivia, il y a 7 ans

Hello,

Va voir du côté du composant Guard de Symfony.

Petite remarque, la seconde règle d'access_control n'est jamais utilisé, car la première règle la recouvre. La première règle qui matche est utilisée, et /admin/traitement match avec /admin...
Il faudrait plutôt :

access_control: - { path: ^/admin/traitement, roles: ROLE_SOUSCOMMISSION } - { path: ^/admin, roles: ROLE_ADMIN }
Le Saint, il y a 7 ans

Salut tu peux nous montrer l'erreur que symfony signal question de mieux comprendre

Lartak, il y a 7 ans

@Matthieu Gourdon : Supprimes ton message car il n'a rien à faire avec le sujet, surtout que tu as créé ton propre sujet.

ravikant, il y a 7 ans

good Post ! amazing Post

Le Saint, il y a 7 ans

Salut le probleme est que symfony enregistre bien ton utilisateur mais au niveau du role au lieu de l'enregistrer comme etant un tableau il l'enregistre comme une chaine de caractere ce ce qui justifie le access Denied

pour resourdre ton probleme essaye ceci:

public function inscription(Request $request, ObjectManager $manager, UserPasswordEncoderInterface $encoder)
{
    $user= new User();
    $form = $this->createForm(UserType::class, $user);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {

        $role = $request->request->get('User')['role'];
        $user->setRole(array($role));

        $hash = $encoder->encodePassword($user, $user->getPassword());
        $user->setPassword($hash);
        $manager->persist($user);
        $manager->flush();

        return $this->redirectToRoute('security_login');
    }

    return $this->render('security/inscrie.html.twig', [

        'form' => $form->createView(),
    ]);
}