簡體   English   中英

Laravel 8:用數據庫表檢查用戶數據不能正常工作

[英]Laravel 8: Checking user's data with database table does not work properly

我創建了一個雙因素身份驗證系統,它將用戶重定向到token.blade.php ,他必須在其中輸入要發送到他的電話號碼並存儲在active_codes表中的令牌。

現在我想檢查用戶是否輸入了存儲在active_codes表中的相同令牌代碼,如下所示:

在此處輸入圖像描述

然后在 Controller,我嘗試了這個:

public function submit(Request $request)
    {
        $data = $request->validate([
            'token' => 'required|min:6'
        ]);

        if($data['token'] === auth()->user()->activeCode()->code){
            dd('same');
        }
    }

但是當我輸入相同的令牌時,我得到了這個錯誤:

ErrorException未定義屬性:Illuminate\Database\Eloquent\Relations\HasMany::$code

所以我的問題是如何檢查用戶請求的令牌代碼是否與存儲在數據庫中的令牌代碼相同?

注意: UserActiveCode模型之間的關系是 OneToMany。

User.php

public function activeCode()
    {
        return $this->hasMany(ActiveCode::class);
    }

ActiveCode.php

public function user()
    {
        return $this->belongsTo(User::class);
    }

現在,當您擁有用戶 Model 和 ActiveCode Model 之間的關系時,您可以將其添加到ActiveCode Model 中:

public function scopeVerifyCode($query, $code, $user)
{
   return !! $user->activeCode()->whereCode($code)->where('expired_at', '>', now())->first();
}

您可以在此處閱讀有關本地和全局 scope 的更多信息

但是你需要一些 session 變量來檢查用戶是否沒有看到token.blade.php而不從login.blade.php重定向。 並且還用於將用戶 ID 發送到該路由。

所以在Auth\LoginController ,添加這個:

protected function authenticated(Request $request, $user)
{
    if($user->two_factor_type !== 'off'){ // I assume you have this column at users table 
       auth()->logout(); // reject user from loggin in before submitting token 
       
       $request->session()->flash('auth', [
           'user_id' => $user->id,
           'remember' => $request->has('remember')
       ]);
    }
}

然后你可以 go 到你的 Controller 並寫下這個:

public function submit(Request $request)
{
        $request->validate([
            'token' => 'required|min:6'
        ]);

        if($request->session()->has('auth')){
            return redirect(route('login'));
        }

        $user = User::findOrFail($request->session()->get('auth.user_id'));

        $status = ActiveCode::verifyCode($request->token,$user);

        if(!$status){
            return redirect(route('login'));
        }
        
        if(auth()->loginUsingId($user->id,$request->session()->get('auth.remember'))){
            return redirect('/'); // logs in user to homepage or any other route as you wish
        }
}

您的解決方案非常簡單,您沒有執行->first()->get() ,因此您嘗試訪問HasMany class 上的 model 屬性。

此代碼應類似於:

auth()->user()->activeCode()->first()->code

但是,如果您有超過 1 個代碼,那么您應該執行以下操作:

public function submit(Request $request)
{
    $data = $request->validate([
        'token' => 'required|min:6'
    ]);

    if(auth()->user()->activeCode()->where('code', $data['token'])->exists()){
        dd('same');
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM