我已经使用Laravel 5.4实现了默认的注册/登录可能性。
现在我想在身份验证中添加第二个因素。在用户输入他的凭证后,我希望向他发送一封带有安全码的电子邮件,并向用户提供一个表单,用于从他的电子邮件中插入安全代码。只有在他插入了正确的安全代码后我才允许用户登录。
我的问题是如何使用Laravel 5.4在登录流程中创建额外的步骤?目前,Laravel创建的LoginController是空的,我不知道如何在登录过程中立足。
答案 0 :(得分:2)
如评论中所述,此问题有多个步骤。
我认为令牌生成部分应该是微不足道的。所以继续:
向用户发送电子邮件,这可以分为多个步骤。
处理事件。
/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return User
*/
protected function create(array $data){
$user = User::create([
'name' => $data['firstname'] . " " . $data['lastname'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
'email_token' => str_random(10),
'verified' => false
]);
event(new UserRegistered($user));
return $user;
}
为此,您需要将email_token
和verified
字段添加到User
模型并进行迁移。
这将创建一个新用户并生成一个令牌(此令牌生成不安全!在此之后它将触发UserRegistered
事件。
此事件将类似于:
class UserRegistered{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $user;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct(User $user){
$this->user = $user;
}
}
要收听此活动,您需要创建听众
class UserListener{
/**
* Handle the event.
*
* @param UserRegistered $event
* @return void
*/
public function handle(UserRegistered $
Mail::to($event->user)->send(new EmailVerification($event->user));
//EmailVerficiation is an instance of Mailable;
}
}
并将此侦听器绑定到您的AppServiceProvider
编辑以下内容的事件
protected $listen = [
'App\Events\UserRegistered' => [
'App\Listeners\UserListener',
],
];
在此之后,您需要创建用户可以确认其电子邮件的路线。
然后您可以创建一个新的中间件:
class EmailVerification
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(Auth::user()->verified) {
return $next($request);
}
return redirect('/wait_for_approval');
// Or any other route to indicate that they need to validate their email.
}
}
然后,您需要在Kernel.php
添加$routeMiddleware
'auth.approved_email' => \App\Http\Middleware\EmailVerification::class,
中注册此中间件
然后您可以直接使用此中间件或将其与其他中间件组合在一起。
答案 1 :(得分:-2)
要实现您的目标,您需要使用Laravel的中间件。有关详细信息,请查看此处 - https://laravel.com/docs/5.4/middleware#registering-middleware