我正在尝试在 Lumen 中实现密码重置功能,但未能成功。
Lumen 可以访问 Laravel 的PasswordBroker和PasswordManager 之类的东西,但我无法使用它并成功。是否有任何解决方案。
好的,所以我自己使用 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"
Run Code Online (Sandbox Code Playgroud)
配置文件
需要一些额外的配置文件:
我只是从 Laravel 5.6 复制了这些,没有做任何更改。我还将邮件变量添加到我的.env文件中。
引导程序/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();
Run Code Online (Sandbox Code Playgroud)
数据库
我使用了默认的 Laravel password_resets 表:
Schema::create('password_resets', function (Blueprint $table) {
$table->string('email')->index();
$table->string('token');
$table->timestamp('created_at')->nullable();
});
Run Code Online (Sandbox Code Playgroud)
现在对代码进行真正的更改。
基于Illuminate\Foundation\Auth\SendsPasswordResetEmails和Illuminate\Foundation\Auth\ResetsPasswords 的代码。
身份验证控制器
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();
}
}
Run Code Online (Sandbox Code Playgroud)
用户模型
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;
...
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6675 次 |
最近记录: |