作者:甄Ven-Li | 来源:互联网 | 2023-09-01 16:04
我正在尝试通过本教程实现Google2FA:https://www.sitepoint.com/2fa-in-laravel-with-google-authenticator-get-secure/
我使用Laravel 5.8,在本教程中,他们使用的是5,我想这就是为什么我没有
app/Http/Controllers/Auth/AuthController.php
了。我有LoginController.php和RegisterController.php
如果我尝试登录并进行测试,则会收到此错误:
参数2传递给
App\Http\Controllers\Auth\LoginController::authenticated() must be an instance of App\Http\Controllers\Auth\Authenticatable,instance of App\User given,called in C:\xampp\htdocs\XXX\vendor\laravel\framework\src\Illuminate\Foundation\Auth\AuthenticatesUsers.php on line 109
代码:
private function authenticated(Request $request,Authenticatable $user)
{
if ($user->google2fa_secret) {
Auth::logout();
$request->session()->put('2fa:user:id',$user->id);
return redirect('2fa/validate');
}
return redirect()->intended($this->redirectTo);
}
用户模型
namespace App;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use ChristianKuri\LaravelFavorite\Traits\Favoriteability;
class User extends Authenticatable
{
use Notifiable;
use Favoriteability;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name','email','password','slug','premium_ends','is_banned','ban_reason','ban_ends','apikey','admin',];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password','remember_token','google2fa_secret',];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',];
?>
LoginController
namespace App\Http\Controllers\Auth;
use Auth;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = '/dashboard';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
}
protected function validateLogin(Request $request)
{
$this->validate($request,[
'email' => 'required','password' => 'required','g-recaptcha-response' => 'required|captcha'
]);
}
private function authenticated(Request $request,$user->id);
return redirect('2fa/validate');
}
return redirect()->intended($this->redirectTo);
}
public function getValidateToken()
{
if (session('2fa:user:id')) {
return view('2fa/validate');
}
return redirect('login');
}
public function postValidateToken(ValidateSecretRequest $request)
{
//get user id and create cache key
$userId = $request->session()->pull('2fa:user:id');
$key = $userId . ':' . $request->totp;
//use cache to store token to blacklist
Cache::add($key,true,4);
//login and redirect user
Auth::loginUsingId($userId);
return redirect()->intended($this->redirectTo);
}
public function logout(Request $request) {
Auth::logout();
return redirect('/');
}
}
我在做什么错了?
只需删除您在authenticated
的方法签名上的typehint:
protected function authenticated(Request $request,$user)
您不需要它。如果您确实需要它,则需要确保正确命名该接口,以便它不认为您在当前名称空间中引用Authenticatable
。您可以使用合同Illuminate\Contracts\Auth\Authenticatable
:
use Illuminate\Contracts\Auth\Authenticatable;
...
protected function authenticated(Request $request,Authenticatable $user)