Symfony نسيت كلمة المرور بدون FosUserBundle

-1

لذلك أنا أحاول إنشاء موقع على شبكة الإنترنت باستخدام symfony ، حيث سيكون للمستخدمين. يحتاج هؤلاء المستخدمون إلى أن يكونوا قادرين على تغيير كلمات المرور الخاصة بهم من داخل حساباتهم (لا ينبغي أن يكون هذا صعبًا ، وهو نموذج بسيط يغير عند إرسال كلمة المرور الحالية user ) ومع ذلك ، أواجه صعوبة في ابتكار طريقة لتنفيذ "إعادة تعيين كلمة المرور" للمستخدمين الذين نسوا كلمة المرور بالكامل.

كانت خطتي أن يرسل المستخدمون بريدًا إلكترونيًا يحتوي على رابط فريد. عند زيارة هذا الرابط ، symfony (عبر slug ) للتحقق مما إذا كان قد تم إرسال هذا الرابط في آخر 5 دقائق. (ربما تكون هناك قاعدة بيانات في مكان ما تحتوي على قائمة بالارتباطات ، فستكون هناك حاجة إلى أوقات أسماء المستخدمين). ثم سيتم منح المستخدم نموذجًا بسيطًا حيث يمكنه إدخال كلمة المرور الجديدة ، ثم إعادة توجيهه إلى صفحة تسجيل الدخول.

مشكلتي هي أنني لا أستطيع أن أركض getUser عندما لا تتم المصادقة على المستخدم بالفعل. حتى إذا كانت قاعدة البيانات الخاصة بي للأوقات والروابط وأسماء المستخدمين يمكن أن تشير إلى مستخدم معين ، بقدر ما أرى ، لن يقوم Symfony بتحميل user حتى يتم المصادقة عليها بكلمة مرور بشكل صحيح. كيف يمكنني الحصول على حول هذا؟ هل يجب أن أكتب إلى قاعدة البيانات يدويًا دون تضمين حزمة الأمان / user صف دراسي؟ شكر.

3 الاجابة

1
افضل جواب

استخدام الخاص بك Repository/UserRepository الطبقة للحصول على User كيان من ديسيبل. تعديل User الاعتراض واستمراره باستخدام EntityManager صف دراسي.

$userRepo = $doctrine->getRepository( 'User' );

$user = $userRepo->find( $userId );

if ( $user !== null ) {

    $encryptedPassword = someHowEncryptThePassword( $plainPassword );
    $user->setPassword( $encryptedPassword );

    $em = $doctrine->getManager();
    $em->persist( $user );
    $em->flush();

}
:مؤلف
1
افضل جواب

يمكنك تحميل المستخدم في أي وقت تريد. عندما تكون في صفحة إعادة التعيين والوقت صالح ، فأنت تعرف أيضًا أن معرف المستخدم يستخدم User Manager أو ما هي خدمتك وتغير كلمة مرور المستخدم.

:مؤلف
0

في رأيي يجب عليك تخزين الرابط الفريد مع علاقة على المستخدم.

//Quick example
$user = $em->getRepository( 'App:User' )->findByEmail($email);

$lostPassword = new LostPassword();
$lostPassword->setUser($user);
$lostPassword->setHash(uniqid());
//Use hash to send the email to the user here

الرمز السابق هو عندما يملأ المستخدم النموذج ببريده الإلكتروني. يمكنك حفظ المستخدم والتجزئة التي تم إنشاؤها وإرسال البريد الإلكتروني.

في مسار إعادة تعيين كلمة المرور ، ما عليك سوى الحصول على التجزئة وإجراء البحث عليها

 $lostPassword= $em->getRepository( 'App:LostPassword' )->findByHash($hash);
 $user = $lostPassword->getUser();
 //Your code managment to change the password

أتمنى أن يساعدك هذا.

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام