Вход в Symfony 4: отсутствие сохранения данных - PullRequest
2 голосов
/ 21 марта 2019

Мне нужно создать форму для входа, чтобы у указанного посетителя был доступ к панели администратора.

У меня есть форма для входа в систему в качестве администратора.Существует перенаправление к этой форме входа в систему, когда кто-то хочет получить доступ к пути /admin*.

Однако у меня есть проблема с сохранением данных, и мне кажется, что я никогда не вошел в систему.

Мой файл security.yaml:

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

    providers:
        in_database:
            entity:
                class: App\Entity\User
                property: email

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        main:
            anonymous: true

            provider: in_database
            pattern: /admin*

            form_login:
                login_path: security_login
                check_path: security_login

            logout:
                path: security_logout
                target: home

    access_control:
        - { path: ^/admin, roles: ROLE_ADMIN }
        - { path: ^/(connexion)$, role: IS_AUTHENTICATED_ANONYMOUSLY }

Мой главный контроллер:

 /**
 * @Route("/connexion", name="security_login")
 */
 public function login() {
     return $this->render('admin/login.html.twig');
 }

Моя HTML-форма:

    <form action="{{ path('security_login') }}" method="post">
        <div class="form-group">
            <input type="email" class="form-control" placeholder="Adresse mail" required name="_username">
        </div>
        <div class="form-group">
            <input type="password" class="form-control" placeholder="Mot de passe" required name="_password">
        </div>
        <div class="form-group">
            <button type="submit" class="btn btn-success">Connexion</button>
        </div>
    </form>

PHP

В моемПользовательский объект, который позволяет мне создавать только пользователей-администраторов, идентифицированных по их электронной почте, у меня есть это:

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 * @UniqueEntity(
 *  fields={"email"},
 *  message="L'email que vous avez indiqué est déjà utilisé !"
 * )
 */
class User implements UserInterface
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     * @Assert\Email()
     */
    private $email;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $username;

    /**
     * @ORM\Column(type="string", length=255)
     * @Assert\Length(min="8", minMessage="Votre mot de passe doit faire au minimum {{limit}} caractères")
     */
    private $password;

     /**
     * @Assert\EqualTo(propertyPath="password", message="Vous n'avez pas tapé le même mot de passe")
     */
    public $confirm_password;


    public function getId(): ?int
    {
        return $this->id;
    }

    public function getEmail(): ?string
    {
        return $this->email;
    }

    public function setEmail(string $email): self
    {
        $this->email = $email;

        return $this;
    }

    public function getUsername(): ?string
    {
        return $this->username;
    }

    public function setUsername(string $username): self
    {
        $this->username = $username;

        return $this;
    }

    public function getPassword(): ?string
    {
        return $this->password;
    }

    public function setPassword(string $password): self
    {
        $this->password = $password;

        return $this;
    }

    public function eraseCredentials() {}

    public function getSalt() {}

    public function getRoles() {
  return ['ROLE_ADMIN'];
    }

Вопрос

Почему данные не сохраняются после отправки формы входа?Что я должен добавить / изменить, чтобы решить мою проблему и получить доступ к панели администратора (с перенаправлением на нее) после заполнения формы?

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Путь, используемый для вашего маршрута входа в систему (т. Е. /connexion), не находится за брандмауэром, для которого вы пытаетесь аутентифицировать своего пользователя. Самое простое решение - удалить опцию pattern для вашего main брандмауэра, так как на самом деле вам не требуется более одного брандмауэра, а main может просто обрабатывать все запросы (кроме тех, которые для инструментов разработки исключены) межсетевым экраном dev).

1 голос
/ 22 марта 2019

Данные не сохраняются, потому что вы нигде не сохраняете их.Вы только визуализируете форму в контроллере, но нет кода, ответственного за сохранение данных в базе данных.

ИМО Прежде всего вам необходимо построить форму.Вы должны создать отдельный класс (например, UserType), отвечающий за рендеринг полей в форме. Здесь вы можете прочитать о построении форм, а внизу вы можете увидеть, как создать класс типа формы, о котором я упоминал выше.

Во-вторых, вы должны использовать, например, EntityManager для сохраненияи сбросить пользовательские данные в базу данных.Теперь у вас нет кода, ответственного за это. Здесь вы можете прочитать о создании простой формы регистрации в вашем приложении Symfony.

Пример действия контроллера:

/**
 * @Route("/connexion", name="security_login")
 */
 public function login() 
{
    $user = $this->get('user_factory')->create();

    $form = $this->createForm(UserType::class, $user);

    $form->handleRequest($request);

    if ($form->isValid()) {
       $this->getDoctrine()->getManager()->persist($user);
       $this->getDoctrine()->getManager()->flush();

       $this->addFlash(FlashType::SUCCESS, 'Account was created');

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

    return $this->render('admin/login.html.twig', [
        'form' => $form->createView(),
    ]);
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...