Laravel 6自定义控制器集成登录限流时报username方法不存在如何解决
问题原因
你使用的Illuminate\Foundation\Auth\ThrottlesLogins trait 内部依赖控制器的username()方法确定限流时对应的用户登录标识字段,你自定义的AuthController没有实现这个方法,因此抛出方法不存在的异常。
解决方法
直接在AuthController中添加username()方法,返回你前端请求中传递的登录用户名字段名即可:
<?php namespace Modules\Auth\Http\Controllers; use Illuminate\Contracts\Support\Renderable; use Illuminate\Http\Request; use Illuminate\Routing\Controller; use Auth; use Validator; use Illuminate\Foundation\Auth\ThrottlesLogins; class AuthController extends Controller { use ThrottlesLogins; protected $maxAttempts = 5; protected $decayMinutes = 1; // 新增该方法即可 public function username() { // 此处返回值为你请求参数里的登录用户名字段名,你的代码里对应字段为username return 'username'; } public function login(Request $request) { // 原有login方法逻辑保持不变即可 $input = $request->all(); $rules = [ 'username' => 'required|email', 'password' => 'required' ]; $validator = Validator::make($input, $rules); if ($validator->fails()) { return false; } if (method_exists($this, 'hasTooManyLoginAttempts') && $this->hasTooManyLoginAttempts($request)) { $this->fireLockoutEvent($request); return $this->sendLockoutResponse($request); } $authenticated = Auth::attempt([ 'email' => $request->input('username'), 'password' => $request->input('password') ]); if($authenticated){ $this->clearLoginAttempts($request); } else { $this->incrementLoginAttempts($request); } } }
补充说明
如果后续你修改了登录请求的用户名字段(比如改为直接传email),只需要把username()方法的返回值修改为对应的字段名即可。
内容的提问来源于stack exchange,提问作者Sevymol Sebastian
相关产品推荐
相关产品推荐

