2017-08-15 43 views
1

我已經實現了Laravel 5.4的默認註冊/登錄可能性。登錄用戶之前的其他步驟

現在我想添加第二個因素來驗證。用戶輸入他的憑據後,我希望向他發送一封帶有安全代碼的電子郵件,並向用戶提供一份表格,用於從他的電子郵件中插入安全代碼。只有在他插入了正確的安全代碼後,我才希望允許用戶登錄。

我的問題是如何在使用Laravel 5.4的登錄流程中創建此額外步驟?目前由Laravel創建的LoginController是空的,我不知道如何在登錄過程中獲得立足點。

+0

有很多步驟需要回答你的問題。將它分解成更小的問題可能會更好,比如「發送確認郵件給用戶」,「通過確認URL驗證用戶」等。當前你的問題太廣泛了。 – DrRoach

+0

其實這只是我需要做的描述,而且我知道如何去做大部分:)我問的問題是如何在laravels身份驗證過程中獲得立足點,以便我可以執行這些步驟。 – user1985273

+0

使用中間件? –

回答

-2

爲了達到你想要的,你想使用Laravel的中間件。欲瞭解更多信息,請看這裏 - https://laravel.com/docs/5.4/middleware#registering-middleware

+0

一個潛在的解決方案的鏈接總是受歡迎的,但請[添加鏈接上下文](// meta.stackoverflow.com/a/8259),以便您的同行用戶將有一些想法是什麼以及它爲什麼在那裏。 **如果目標網站無法訪問或永久離線,請務必引用重要鏈接中最相關的部分**考慮到_僅僅是鏈接到外部網站_是可能的原因,因爲[Why and如何刪除一些答案?](// stackoverflow.com/help/deleted-answers)。 – milo526

+0

只有在我的電話在分鐘,所以會在家時更新 – DrRoach

2

正如評論中所述,這個問題有多個步驟。

  1. 生成安全令牌。
  2. 發送電子郵件給用戶。
  3. 讓用戶發佈此令牌。
  4. 檢查用戶是否在必要時進行了驗證。

我認爲令牌生成部分應該是微不足道的。所以繼續:

發送電子郵件給用戶,這又可以分成多個步驟。

  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; 
    } 
    

爲此,您需要將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,

然後你就可以直接使用這個中間件或把它與其他中間件組成一個組。

相關問題