Ошибка Symfony 4 в $ encoder-> encodePassword ($ user, $ password); - PullRequest
0 голосов
/ 18 сентября 2018

Я застрял с Sf4:

Я хочу сделать систему аутентификации без FOS, но когда я хочу сделать функцию reset-pwd, у меня появляется эта ошибка:

Argument 1 passed to UserPasswordEncoder::encodePassword() must implement interface UserInterface, array given, called in SecurityController.php on line 56

МойSecurityController.php:

<?php

namespace App\Controller;

use App\Form\ChangePasswordType;
use App\Entity\User;

use App\Repository\UserRepository;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;

use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;

class SecurityController extends AbstractController {
    public function login(AuthenticationUtils $helper): Response {
        return $this->render('security/login.html.twig', [
            // dernier username saisi (si il y en a un)
            'last_username' => $helper->getLastUsername(),
            // La derniere erreur de connexion (si il y en a une)
            'error' => $helper->getLastAuthenticationError(),
        ]);
    }

    public function logout(): void {
        throw new \Exception('This should never be reached!');
    }


    public function resetpwd (Request $request, UserPasswordEncoderInterface $encoder) {

        $manager = $this->getDoctrine()->getManager();

        $changePassword = $request->request->get('change_password');

        $username = $changePassword['username'];
        $password = $changePassword['password']['first'];

        $user = new User();

        $user = $manager->getRepository(User::class)->findBy(['username' => $username]);

        if (!$username) {
            $this->addFlash('danger', 'User not found for '. $username);
        }

        $form = $this->createForm(ChangePasswordType::class, $user);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            try {
                $pass = $encoder->encodePassword($user, $password);
                $user->setPassword($pass);
                $manager->flush();
                $this->addFlash('success', 'Password Changed!');
            } catch (Exception $e) {
                $this->addFlash('danger', 'Something went skew-if. Please try again.');
            }
            return $this->redirectToRoute('athena_restepwd');
        }
        return $this->render('security/reset.html.twig', array('form' => $form->createView()));
    }
}

Моя учетная запись:

<?php

namespace App\Entity;

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

/**
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 * @ORM\Table(name="user")
 * @UniqueEntity(fields="email", message="Email déjà pris")
 * @UniqueEntity(fields="username", message="Username déjà pris")
 */
class User implements UserInterface, \Serializable {
    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(type="string")
     * @Assert\NotBlank()
     */
    private $fullName;

    /**
     * @var string
     *
     * @ORM\Column(type="string", unique=true)
     * @Assert\NotBlank()
     */
    private $username;

    /**
     * @var string
     *
     * @ORM\Column(type="string", unique=true)
     * @Assert\NotBlank()
     * @Assert\Email()
     */
    private $email;

    /**
     * @var string
     *
     * @ORM\Column(type="string", length=64)
     */
    private $password;

    /**
     * @var array
     *
     * @ORM\Column(type="array")
     */
    private $roles = [];

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

    public function setFullName(string $fullName): void {
        $this->fullName = $fullName;
    }

    public function getFullName(): ?string {
        return $this->fullName;
    }

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

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

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

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

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

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

    /**
     * Retourne les rôles de l'user
     */
    public function getRoles(): array {
        $roles = $this->roles;

        // Afin d'être sûr qu'un user a toujours au moins 1 rôle
        if (empty($roles)) {
            $roles[] = 'ROLE_USER';
        }

        return array_unique($roles);
    }

    public function setRoles(array $roles): void {
        $this->roles = $roles;
    }

    /**
     * Retour le salt qui a servi à coder le mot de passe
     *
     * {@inheritdoc}
     */
    public function getSalt(): ?string {
        // See "Do you need to use a Salt?" at https://symfony.com/doc/current/cookbook/security/entity_provider.html
        // we're using bcrypt in security.yml to encode the password, so
        // the salt value is built-in and you don't have to generate one

        return null;
    }

    /**
     * Removes sensitive data from the user.
     *
     * {@inheritdoc}
     */
    public function eraseCredentials(): void {
        // Nous n'avons pas besoin de cette methode car nous n'utilions pas de plainPassword
        // Mais elle est obligatoire car comprise dans l'interface UserInterface
        // $this->plainPassword = null;
    }

    /**
     * {@inheritdoc}
     */
    public function serialize(): string {
        return serialize([$this->id, $this->username, $this->password]);
    }

    /**
     * {@inheritdoc}
     */
    public function unserialize($serialized): void {
        [$this->id, $this->username, $this->password] = unserialize($serialized, ['allowed_classes' => false]);
    }
}

Я также попытался создать второго фальшивого пользователя с $user2 = new User(); и использовать его на $pass = $encoder->encodePassword($user, $password); при изменении сообщения об ошибкеto: Вызов функции-члена setPassword () для массива , поэтому я думаю, что моя сущность неверна, но я обнаружил свою ошибку

Regard,

1 Ответ

0 голосов
/ 18 сентября 2018

Вы присвоили массив переменной $user:

    $user = new User();

    $user = $manager->getRepository(User::class)->findBy(['username' => $username]);

    if (!$username) {
        $this->addFlash('danger', 'User not found for '. $username);

Метод класса репозитория findBy возвращает массив объектов.Вместо этого используйте findOneBy.

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