मैं एक उपयोगकर्ता को अपने व्यक्तिगत स्थान से अपना पासवर्ड बदलने की अनुमति देना चाहता हूं। इसके लिए उसे कनेक्ट करना होगा, इसलिए उसका पासवर्ड जान लें। पासवर्ड बदलने के लिए इसे निम्नानुसार आगे बढ़ना चाहिए:

  • पुराना पासवर्ड डालें
  • नया पासवर्ड दर्ज करें और इसकी पुष्टि करें (स्क्रीनशॉट)

सिवाय इसके कि मुझे एक समस्या है जो मुझे बिल्कुल समझ में नहीं आती है। मैं पासवर्ड तुलना चरण पास नहीं कर सकता। मैं जांचता हूं कि दर्ज किया गया पुराना पासवर्ड डेटाबेस में से एक से अलग है या नहीं, अगर यह है तो मैं एक त्रुटि भेजता हूं। अन्यथा, मैं डेटाबेस को नया पासवर्ड भेजता हूं।

तुम क्या सोचते हो ? क्या यह सही तरीका है?

मेरा नियंत्रक

     /**
     * @Route("/account/settings", name="account_settings")
     * @IsGranted("ROLE_USER")
     * @param Request $request
     * @param UserPasswordEncoderInterface $passwordEncoder
     * @param ObjectManager $manager
     * @return Response
     */
    public function settings(Request $request, UserPasswordEncoderInterface $passwordEncoder, ObjectManager $manager): Response
    {
        $updatePassword = new UpdatePassword();
        $user = $this->getUser();

        $form = $this->createForm(UpdatePasswordType::class, $updatePassword);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            if (!password_verify($updatePassword->getOldPassword(), $user->getHash())) {
                $form->get('oldPassword')->addError(new FormError('L’ancien mot de passe ne correspond pas'));
            } else {
                $newPassword = $updatePassword->getNewPassword();
                $hash = $passwordEncoder->encodePassword($user, $newPassword);

                $user->setHash($hash);
                $manager->persist($user);
                $manager->flush();

                $this->addFlash(
                    'success',
                    'votre mot de passe a bien été mise à jour'
                );

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

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

मेरी इकाई

<?php

namespace App\Entity;

use Symfony\Component\Validator\Constraints as Assert;

class UpdatePassword
{
    private $oldPassword;

    /**
     * @Assert\Length(min=8, minMessage="Le mot de passe doit être composé d'au moins 8 caractères")
     */
    private $newPassword;

    /**
     * @Assert\EqualTo(propertyPath="newPassword", message="La confirmation du mot de passe ne correspond pas")
     */
    private $confirmPassword;

    public function getOldPassword(): ?string
    {
        return $this->oldPassword;
    }

    public function setOldPassword(string $oldPassword): self
    {
        $this->oldPassword = $oldPassword;

        return $this;
    }

    public function getNewPassword(): ?string
    {
        return $this->newPassword;
    }

    public function setNewPassword(string $newPassword): self
    {
        $this->newPassword = $newPassword;

        return $this;
    }

    public function getConfirmPassword(): ?string
    {
        return $this->confirmPassword;
    }

    public function setConfirmPassword(string $confirmPassword): self
    {
        $this->confirmPassword = $confirmPassword;

        return $this;
    }
}

मेरी सुरक्षा.yaml फ़ाइल

security:
    role_hierarchy:
        ROLE_PRO: ROLE_USER
        ROLE_ADMIN: [ROLE_USER, ROLE_PRO]
        ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

    encoders:
        App\Entity\User:
            algorithm: auto
    # 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: email
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            anonymous: true
            remember_me:
                secret:   '%kernel.secret%'
                lifetime: 604800 # 1 week in seconds
                path:     /

            provider: in_database

            form_login:
                login_path: account_login
                check_path: account_login
                default_target_path: account_index

            logout:
                path: account_logout
                target: account_login

            # activate different ways to authenticate
            # https://symfony.com/doc/current/security.html#firewalls-authentication

            # https://symfony.com/doc/current/security/impersonating_user.html
            # switch_user: true

    # 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: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/account, roles: ROLE_USER }
        # - { path: ^/profile, roles: ROLE_ADMIN }
-1
Ismael 30 अगस्त 2019, 23:03

1 उत्तर

सबसे बढ़िया उत्तर

दरअसल, हमें PHP 7.2 से 7.3. तक जाना चाहिए Symfny 4.3.2 में, पासवर्ड एन्क्रिप्शन automatically किया जाता है। यह इस समय का सबसे अधिक उपयोग किया जाने वाला और सबसे सुरक्षित एन्क्रिप्शन एल्गोरिथम चुनता है लेकिन इसके ठीक से काम करने के लिए आपको php को अपडेट करना होगा!

यदि आप डॉकर का उपयोग करते हैं, तो आपको ऐसा करना होगा।

FROM php:7.3-fpm
RUN apt-get update && apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libpng-dev \
    && docker-php-ext-install -j$(nproc) iconv \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd

और mysqli एक्सटेंशन को न भूलें।

RUN docker-php-ext-install mysqli pdo pdo_mysql

RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install gd
1
Ismael 31 अगस्त 2019, 07:16