Laravel登录次数限制

应为Laravel 登录限制提供太少了,我用搜索引擎搜索到比较详细的教程,原链接在文章最下面,如果本文章看不懂请跳到原链接去查看。

推荐方法3,因为会提示剩下多少时间才可以登录,自定义属性比较多,如下图。

方法1

使用Laravel的自带Auth组件生成登陆注册,是自带登陆限流验证的

php artisan make:auth

方法2

路由中添加中间件来实现功能。

Route::get(‘/login’,’LoginController@login’)->middleware(‘throttle:3,1’);

3 表示错误次数。
1 表示满足错误次数后禁止用户访问时间,单位是

方法3

使用 Illuminate\Foundation\Auth\ThrottlesLogins

  1. 在控制器中引入 ThrottlesLogins
    use ThrottlesLogins;
  2. 控制器中重写AuthenticatesUsers中username方法
    public function username() {
    return 'email';
    }
  3. 判断是否错误多次,如果错误多次就禁止用户登录。
    if ($this->hasTooManyLoginAttempts($request)) {
    return $this->sendLockoutResponse($request);
    }
  4. 增加错误尝试次数
    $this->incrementLoginAttempts($request);
  5. 注意: 模型要继承Authenticatable

方法二 控制器中代码

<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Http\Request;

class UserController extends Controller
{
    use ThrottlesLogins;
    // 重写 AuthenticatesUsers 中的 username 方法
    function username()
    {
        return 'email';
    }

    public function login(Request $request)
    {
        // 判断是否被限制登录
        if ($this->hasTooManyLoginAttempts($request)) {
            // 锁定账号
            return $this->sendLockoutResponse($request);
        }
        // 判断POST提交数据是否正确
        $this->validate($request, [
            'email' => 'required|email|max:100',
            'password' => 'required|min:6|max:16',
        ]);
        // 记录用户错误次数
        $this->incrementLoginAttempts($request);
        // 登录验证
        if (\Auth::guard('admin')->attempt($request->only('email', 'password'))) {
            return redirect(route('admin'));
        } else {
            return back()->withErrors("账号或者密码错误!");
        }
    }
}

扩展

Illuminate\Foundation\Auth\ThrottlesLogins这个trait有如下方法:

limiter();
// limiter方法,从服务容器获取 RateLimiter 实例,专门连接缓存记录用户登录次数;

throttleKey(Request $request);
// 该方法的内部代码为 return Str::lower($request->input($this->username())).'|'.$request->ip();
// 返回的值为 缓存数据库中的Key; 
// 比如 张三从 192.168.1.11 登录系统,5次尝试登录失败,那么此处的返回值是 张三 | 192.168.1.11
// 缓存数据库中有一条记录是 键名为 '张三 | 192.168.1.11', 键值为 '5'

hasTooManyLoginAttempts(Request $request);
// 判断是否用户失败登录频率超过门槛值(1分钟内失败5次);

incrementLoginAttempts(Request $request);
// 用户在缓存数据库中的登录次数值,如果存在则加1;不存在,则新增,同时设置过期时间(默认是1分钟)

sendLockoutResponse(Request $request);
// 这方法被调用意味着用户已经超过登录上限,此时方法会 back 到登录页,并携带'登录超过上限,请于58秒后再次登录'这样的提示; 

clearLoginAttempts(Request $request);
// 清除指定用户在缓存数据库中的登录次数记录,包括Lock记录;

fireLockoutEvent(Request $request);
// 方法内部就一句话,event(new Lockout($request)); 触发 lockout 事件

来自

https://segmentfault.com/q/1010000009594331