Ajouter ROLE depuis le formulaire d'inscruption

Default
,

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éponse

87112
,

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 }
Default
,

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

17162
,

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

179276
,

good Post ! amazing Post

Default
,

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(),
    ]);
}