laravel登录失败过多限制登录

简单使用

laravel有自带的登录限制:ThrottlesLogins;位于Illuminate\Foundation\Auth\ThrottlesLogins,是一个trait,use进来即可;这个trait实现了1分钟内登录5次失败就禁止登录1分钟.
登录代码:

  public function postLogin(Request $request)
  {
        if ($this->hasTooManyLoginAttempts($request)) {
            $this->fireLockoutEvent($request);

            return $this->sendLockoutResponse($request);
        }

        $credentials = $request->only([$this->username(), 'password']);

        /** @var \Illuminate\Validation\Validator $validator */
        $validator = Validator::make($credentials, [
            $this->username() => 'required',
            'password' => 'required',
        ]);

        if ($validator->fails()) {
            $this->incrementLoginAttempts($request);

            return back()->withInput()->withErrors($validator);
        }

        if (! $this->guard()->attempt($credentials)) {
            $this->incrementLoginAttempts($request);

            return back()->withInput()->withErrors([
                'password' => $this->getFailedLoginMessage(),
            ]);
        }

        return $this->sendLoginResponse($request);
    }

它的实现很简单,代码并不复杂,两个缓存:
一个缓存记录它失败的次数;键为用户名和ip的组合:Str::lower($request->input($this->username())).'|'.$request->ip();;值为登录失败次数;缓存有效期即为登录失败次数的限定时长,默认一分钟。
另一个缓存则记录它失败设定次数后后锁定时长; 键为上面的键拼接上:timer;值为第一次登录失败时的时间加上限制登录时长;缓存有效期即为限制登录时长,默认一分钟

在登录时根据第一个缓存判断失败次数是否达到设定次数;若没有,走正常的登录流程,若是,则锁定禁止登录。登录失败时通过方法$this->incrementLoginAttempts($request);这个方法调用如下:

    public function hit($key, $decayMinutes = 1)
    {
        $this->cache->add(
            $key.':timer', $this->availableAt($decayMinutes * 60), $decayMinutes
        );

        $added = $this->cache->add($key, 0, $decayMinutes);

        $hits = (int) $this->cache->increment($key);

        if (! $added && $hits == 1) {
            $this->cache->put($key, 1, $decayMinutes);
        }

        return $hits;
    }

如果是第一次登录失败就初始化两个缓存,否则就增加一次错误次数increment($key)
这个trait主要的还是防刷机器登录的,因为他在第一次登录失败就写入了第二个缓存(add 方法将只存储缓存中不存在的数据,不会覆写),这就导致了一个问题:假如我在这一分钟的第一秒失败了第一次,而在这一分钟的最后一秒失败了最后一次的话,那我下一分钟还是可以继续登录。个人认为应该是达到错误次数后才写入第二个缓存。

如果有其他限制需求怎么做呢

也很简单,复制一份ThrottlesLogins和RateLimiter出来修改即可。

  1. 修改最大错误登录次数,修改ThrottlesLogins的maxAttempts()方法
    public function maxAttempts()
    {
        return property_exists($this, 'maxAttempts') ? $this->maxAttempts : 5;
    }
  1. 修改限制登录时长,修改ThrottlesLogins的decayMinutes()方法; 单位:分钟
    public function decayMinutes()
    {
        return property_exists($this, 'decayMinutes') ? $this->decayMinutes : 1;
    }

需要注意的是,修改了限制登录时长的同时也修改了错误登录时间区间;因为上面提到的hit()方法在写入第一个缓存时使用的缓存有效期也是方法decayMinutes()的返回值。所以我们有需要就修改RateLimiter的hit()方法;

例子:20分钟内失败5次锁定30分钟,从最后一次登录失败开始算

    public function hit($key, $decayMinutes = 1)
    {
        $added = $this->cache->add($key, 0, 20);

        $hits = (int) $this->cache->increment($key);

        if (! $added && $hits == 1) {
            $this->cache->put($key, 1, 20);
        }

        if($hits == 5){
            $this->cache->add(
                $key.':timer', $this->availableAt($decayMinutes * 60), $decayMinutes
            );
        }

        return $hits;
    }

其中的细节也可以慢慢修改,尽善尽美。比如限制登录的提示信息等;若还有其他更复杂的限制需求,修改这几个方法就可达到要求,源代码也就这两个类(一个trait一个class)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容