You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 15:36:09