2017-02-14 10 views
3

Я искал в Интернете и до сих пор найти решение следующей задачи ...Как создать метод сброса пароля в Laravel при использовании базы данных пользователя поставщика

Мы в настоящее время имеют веб-сайт разработан с использованием Laravel, который представляет собой таблицу пользователей удаленной базы данных Microsoft SQL. Драйвер в config/auth.php установлен в «базу данных». Все работает отлично для функциональности сброса пароля, который мы получаем следующее сообщение об ошибке, за исключением:

UnexpectedValueException in PasswordBroker.php line 238: User must implement CanResetPassword interface. 

Из моего ограниченного понимания Laravel (это мой первый experiance с Laravel), водитель Eloquent имеет поддержку функциональности CanResetPassword , однако это не было реализовано в Поставщике данных базы данных Laravel, следовательно, ошибка.

Таким образом, мой вопрос заключается в том, имеет ли кто-нибудь конфигурацию, в которой у них есть драйвер для «базы данных» и реализована функция сброса пароля? Все примеры, которые я видел до настоящего времени, связаны с использованием модели Eloquent, которая из моего понимания Laravel не является вариантом, поскольку во время первоначальной разработки нам пришлось изменить драйвер от Eloquent на базу данных, чтобы получить удаленный сервер Microsoft SQL, работающий в первое место. Перемещение базы данных Microsoft SQL в локальную базу данных не является вариантом, которого я боюсь.

В качестве альтернативы, если кто-либо применил другой метод пользователя, который сбросил свой пароль с помощью адреса электронной почты, я был бы открыт для предложений.

+0

Я не вижу никакого «драйвера» в 'config/app.php'.Но я могу помочь вам с пользовательским сбросом пароля, если вам все еще нужно. – EddyTheDove

+0

Неплохо, это были 'config/auth.php', а не' config/app.php', что были указаны параметры драйвера. Я исправлю сообщение. Помощь с пользовательским сбросом пароля была бы высоко оценена. –

ответ

4

Чтобы написать собственную логику сброса пароля, вы все равно можете использовать миграцию по умолчанию, которая выходит из коробки или просто создает вашу. Важнейшая часть - это токен. Поскольку вы делаете свой собственный сброс пароля, вы должны принять несколько решений:

  • Будет ли срок годности?
  • Можете ли вы использовать один и тот же токен несколько раз?

Вам понадобится 2 страницы, 4 разных маршрута и 4 различных функции в одном контроллере. Страница «Я забыл пароль» и страницу «Сбросить пароль». На первой странице отобразите форму, в которой вы берете электронную почту пользователя. Отправьте сообщение следующему контроллеру.

//to be added on top as use statements 
use DB; 
use Auth; 
use Hash; 
use Carbon; 
use App\User; 

public function sendPasswordResetToken(Request $request) 
{ 
    $user = User::where ('email', $request->email)-first(); 
    if (!$user) return redirect()->back()->withErrors(['error' => '404']); 

    //create a new token to be sent to the user. 
    DB::table('password_resets')->insert([ 
     'email' => $request->email, 
     'token' => str_random(60), //change 60 to any length you want 
     'created_at' => Carbon::now() 
    ]); 

    $tokenData = DB::table('password_resets') 
    ->where('email', $request->email)->first(); 

    $token = $tokenData->token; 
    $email = $request->email; // or $email = $tokenData->email; 

    /** 
    * Send email to the email above with a link to your password reset 
    * something like url('password-reset/' . $token) 
    * Sending email varies according to your Laravel version. Very easy to implement 
    */ 
} 

Вторая часть, когда пользователь нажимает на ссылку

/** 
* Assuming the URL looks like this 
* http://localhost/password-reset/random-string-here 
* You check if the user and the token exist and display a page 
*/ 

public function showPasswordResetForm($token) 
{ 
    $tokenData = DB::table('password_resets') 
    ->where('token', $token)->first(); 

    if (!$tokenData) return redirect()->to('home'); //redirect them anywhere you want if the token does not exist. 
    return view('passwords.show'); 
} 

отобразить страницу с формой, содержащей 2 входа - Новый пароль password или whateveer вы хотите - Новое подтверждение пароля password_confirm или любой другой вы хотите Форма должна размещаться на том же URL-адресе, отображаемом на следующий контроллер. Зачем? потому что нам все равно нужно использовать токен, чтобы найти фактического пользователя.

public function resetPassword(Request $request, $token) 
{ 
    //some validation 
    ... 

    $password = $request->password; 
    $tokenData = DB::table('password_resets') 
    ->where('token', $token)->first(); 

    $user = User::where('email', $tokenData->email)->first(); 
    if (!$user) return redirect()->to('home'); //or wherever you want 

    $user->password = Hash::make($password); 
    $user->update(); //or $user->save(); 

    //do we log the user directly or let them login and try their password for the first time ? if yes 
    Auth::login($user); 

    // If the user shouldn't reuse the token later, delete the token 
    DB::table('password_resets')->where('email', $user->email')->delete(); 

    //redirect where we want according to whether they are logged in or not. 
} 

Не забудьте добавить маршруты

Route::get('password-reset', '[email protected]'); //I did not create this controller. it simply displays a view with a form to take the email 
Route::post('password-reset', '[email protected]'); 
Route::get('reset-password/{token}', '[email protected]'); 
Route::post('reset-password/{token}', '[email protected]'); 

Примечание: Там могут быть опечатки или синтаксические ошибки, потому что я не проверял это и написал здесь прямо из верхней части моей головы. Если вы видите ошибку/исключение, не паникуйте, прочитайте ошибку и выполните поиск в Google.

+0

Спасибо, это очень удобно. Я постараюсь осуществить изменения сегодня и дам вам знать, как это получилось :-) –

+0

И не забудьте отметить мой ответ и/или отложить ответ. – EddyTheDove

+0

Теперь я внедрил сброс пароля только с небольшими изменениями для базы данных SQL, которая будет адаптирована к нашей базе данных. Еще раз спасибо @EddyTheDove –