时间:2017-08-15 15:42:12

标签: php laravel laravel-5.4

我已经使用Laravel 5.4实现了默认的注册/登录可能性。

现在我想在身份验证中添加第二个因素。在用户输入他的凭证后,我希望向他发送一封带有安全码的电子邮件,并向用户提供一个表单,用于从他的电子邮件中插入安全代码。只有在他插入了正确的安全代码后我才允许用户登录。

我的问题是如何使用Laravel 5.4在登录流程中创建额外的步骤?目前,Laravel创建的LoginController是空的,我不知道如何在登录过程中立足。

2 个答案:

答案 0 :(得分:2)

如评论中所述,此问题有多个步骤。

  1. 生成安全令牌。
  2. 向用户发送电子邮件。
  3. 让用户发布此令牌。
  4. 检查用户是否在必要时进行了验证。
  5. 我认为令牌生成部分应该是微不足道的。所以继续:

    向用户发送电子邮件,这可以分为多个步骤。

    1. 检测用户何时注册。
    2. 播放活动。
    3. 收听此活动。
    4. 处理事件。

      /**
       * 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;
      }
      
    5. 为此,您需要将email_tokenverified字段添加到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