尝试在 Lumen 中重置密码
Trying to reset Passwords in Lumen
我正在尝试在 Lumen 中实现密码重置功能,但未能成功。
Lumen 可以访问 Laravel 的 PasswordBroker 和 PasswordManager 之类的东西,但我无法使用它并且成功。有什么解决办法吗
我昨晚才弄明白这个问题并写了一篇关于它的博客:
http://www.imjohnbon.com/password-resets-in-lumen/
希望它至少能让你走上正轨。
好的,所以我自己使用 Lumen 5.6 完成了这项工作。 (我已经升级到 5.8,仍然有效,没有做任何更改)。
这些是我必须对我的代码所做的更改。我不得不调整一些东西以适应我的系统,但这可能会对其他人有所帮助。
路线
我想要两条路线。
- 发送重设密码邮件
GET auth/resetpassword?email=fred@example.com
- 重设密码
PUT auth/resetpassword?token=281...b&username=fred&password=banana&password_confirmation=banana
作曲家
要向用户发送电子邮件,需要以下 Laravel 包:
composer require illuminate/mail "^5.6"
composer require illuminate/notifications "^5.6"
配置文件
需要一些额外的配置文件:
- config/auth.php
- config/mail.php
我只是从 Laravel 5.6 复制过来的,没有做任何改动。我还将邮件变量添加到我的 .env 文件中。
bootstrap/app.php
这些新文件需要在应用程序中注册:
$app->configure('auth');
$app->configure('mail');
$app->register(Illuminate\Notifications\NotificationServiceProvider::class);
$app->register(\Illuminate\Mail\MailServiceProvider::class);
$app->alias('mailer', \Illuminate\Contracts\Mail\Mailer::class);
$app->withFacades();
数据库
我用的是默认的Laravelpassword_resetstable:
Schema::create('password_resets', function (Blueprint $table) {
$table->string('email')->index();
$table->string('token');
$table->timestamp('created_at')->nullable();
});
现在对代码进行真正的修改。
基于 Illuminate\Foundation\Auth\SendsPasswordResetEmails 和 Illuminate\Foundation\Auth\ResetsPasswords.
中的代码
AuthController
use Illuminate\Auth\Passwords\PasswordBrokerManager;
use Illuminate\Support\Facades\Password;
use Laravel\Lumen\Routing\Controller;
use Illuminate\Http\Request;
class AuthController extends Controller
{
// 1. Send reset password email
public function generateResetToken(Request $request)
{
// Check email address is valid
$this->validate($request, ['email' => 'required|email']);
// Send password reset to the user with this email address
$response = $this->broker()->sendResetLink(
$request->only('email')
);
return $response == Password::RESET_LINK_SENT
? response()->json(true)
: response()->json(false);
}
// 2. Reset Password
public function resetPassword(Request $request)
{
// Check input is valid
$rules = [
'token' => 'required',
'username' => 'required|string',
'password' => 'required|confirmed|min:6',
];
$this->validate($request, $rules);
// Reset the password
$response = $this->broker()->reset(
$this->credentials($request),
function ($user, $password) {
$user->password = app('hash')->make($password);
$user->save();
}
);
return $response == Password::PASSWORD_RESET
? response()->json(true)
: response()->json(false);
}
/**
* Get the password reset credentials from the request.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
protected function credentials(Request $request)
{
return $request->only('username', 'password', 'password_confirmation', 'token');
}
/**
* Get the broker to be used during password reset.
*
* @return \Illuminate\Contracts\Auth\PasswordBroker
*/
public function broker()
{
$passwordBrokerManager = new PasswordBrokerManager(app());
return $passwordBrokerManager->broker();
}
}
用户模型
use Illuminate\Auth\Passwords\CanResetPassword as CanResetPasswordTrait;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordInterface;
use Illuminate\Notifications\Notifiable;
class User extends Model implements CanResetPasswordInterface
{
use CanResetPasswordTrait;
use Notifiable;
...
}
我正在尝试在 Lumen 中实现密码重置功能,但未能成功。
Lumen 可以访问 Laravel 的 PasswordBroker 和 PasswordManager 之类的东西,但我无法使用它并且成功。有什么解决办法吗
我昨晚才弄明白这个问题并写了一篇关于它的博客:
http://www.imjohnbon.com/password-resets-in-lumen/
希望它至少能让你走上正轨。
好的,所以我自己使用 Lumen 5.6 完成了这项工作。 (我已经升级到 5.8,仍然有效,没有做任何更改)。
这些是我必须对我的代码所做的更改。我不得不调整一些东西以适应我的系统,但这可能会对其他人有所帮助。
路线
我想要两条路线。
- 发送重设密码邮件
GET auth/resetpassword?email=fred@example.com
- 重设密码
PUT auth/resetpassword?token=281...b&username=fred&password=banana&password_confirmation=banana
作曲家
要向用户发送电子邮件,需要以下 Laravel 包:
composer require illuminate/mail "^5.6"
composer require illuminate/notifications "^5.6"
配置文件
需要一些额外的配置文件:
- config/auth.php
- config/mail.php
我只是从 Laravel 5.6 复制过来的,没有做任何改动。我还将邮件变量添加到我的 .env 文件中。
bootstrap/app.php
这些新文件需要在应用程序中注册:
$app->configure('auth');
$app->configure('mail');
$app->register(Illuminate\Notifications\NotificationServiceProvider::class);
$app->register(\Illuminate\Mail\MailServiceProvider::class);
$app->alias('mailer', \Illuminate\Contracts\Mail\Mailer::class);
$app->withFacades();
数据库
我用的是默认的Laravelpassword_resetstable:
Schema::create('password_resets', function (Blueprint $table) {
$table->string('email')->index();
$table->string('token');
$table->timestamp('created_at')->nullable();
});
现在对代码进行真正的修改。
基于 Illuminate\Foundation\Auth\SendsPasswordResetEmails 和 Illuminate\Foundation\Auth\ResetsPasswords.
中的代码AuthController
use Illuminate\Auth\Passwords\PasswordBrokerManager;
use Illuminate\Support\Facades\Password;
use Laravel\Lumen\Routing\Controller;
use Illuminate\Http\Request;
class AuthController extends Controller
{
// 1. Send reset password email
public function generateResetToken(Request $request)
{
// Check email address is valid
$this->validate($request, ['email' => 'required|email']);
// Send password reset to the user with this email address
$response = $this->broker()->sendResetLink(
$request->only('email')
);
return $response == Password::RESET_LINK_SENT
? response()->json(true)
: response()->json(false);
}
// 2. Reset Password
public function resetPassword(Request $request)
{
// Check input is valid
$rules = [
'token' => 'required',
'username' => 'required|string',
'password' => 'required|confirmed|min:6',
];
$this->validate($request, $rules);
// Reset the password
$response = $this->broker()->reset(
$this->credentials($request),
function ($user, $password) {
$user->password = app('hash')->make($password);
$user->save();
}
);
return $response == Password::PASSWORD_RESET
? response()->json(true)
: response()->json(false);
}
/**
* Get the password reset credentials from the request.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
protected function credentials(Request $request)
{
return $request->only('username', 'password', 'password_confirmation', 'token');
}
/**
* Get the broker to be used during password reset.
*
* @return \Illuminate\Contracts\Auth\PasswordBroker
*/
public function broker()
{
$passwordBrokerManager = new PasswordBrokerManager(app());
return $passwordBrokerManager->broker();
}
}
用户模型
use Illuminate\Auth\Passwords\CanResetPassword as CanResetPasswordTrait;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordInterface;
use Illuminate\Notifications\Notifiable;
class User extends Model implements CanResetPasswordInterface
{
use CanResetPasswordTrait;
use Notifiable;
...
}