laravel

laravel5.8实现登录次数限制

2020-03-16  本文已影响0人  这真的是一个帅气的名字

在LogininController中引入LoginController

<?php

namespace App\Http\Controllers\Admin;

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


class LoginController extends Controller
{
    use ThrottlesLogins;//重点
    //表单提交过来的需要验证的字段。如果管理员表用的是laravel默认的users表,可以不指定
    //我这里后台用户表不是默认的users表改成admin_user了
    public $username = 'username';
    public $maxAttempts = 2;//限制最多次数
    

因为自己修改了后台用户,所以要重写两个方法

   /**
     * 重写获取验证字段的方法
     * @return string
     */
    protected function username()
    {
        //判断是否定义了username,没有定义的话就用email
        return property_exists($this,'username')? $this->username : 'email';
    }

    /**
     *  记录登陆错误次数的session
     * @param Request $request
     * @return string
     */
    protected function throttleKey(Request $request)
    {
        //添加admin说明是后台的
        return Str::lower('admin.'.$request->input($this->username())).'|'.$request->ip();
    }

这两个方法框架也提供了。源码位置:

\vendor\laravel\framework\src\Illuminate\Foundation\Auth\ThrottlesLogins.php
\vendor\laravel\framework\src\Illuminate\Foundation\Auth\AuthenticatesUsers.php

登录方法中进行判断限制

        if($this->hasTooManyLoginAttempts($request)){
            $request->session()->flash('errormsg','登录次数过多,请稍后重试');
            $this->incrementLoginAttempts($request);//登录错误次数+1
            Auth::logout();
            return redirect()->back();
        }

完整代码:

<?php

namespace App\Http\Controllers\Admin;

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


class LoginController extends Controller
{
    use ThrottlesLogins;//重点
    //表单提交过来的需要验证的字段。如果管理员表用的是laravel默认的users表,可以不指定
    //我这里后台用户表不是默认的users表改成admin_user了
    public $username = 'username';
    public $maxAttempts = 2;//限制最多次数


    //登录
    public function login(){
        if(Auth::check()){
            return redirect('admin/index');
        }
        return view('admin.login');
    }

    public function dologin(Request $request){
        if($this->hasTooManyLoginAttempts($request)){
            $request->session()->flash('errormsg','登录次数过多,请稍后重试');
            $this->incrementLoginAttempts($request);//登录错误次数+1
            Auth::logout();
            return redirect()->back();
        }

        if(empty($request->input('code'))){
            $request->session()->flash("errormsg","验证码不能为空");
            return redirect()->back();
        }
        if(!captcha_check($request->input('code'))){
            $request->session()->flash("errormsg", "验证码错误");
            return redirect()->back();
        }

        $res = Auth::guard('admin')->attempt(['name' => $request->username, 'password' => $request->password]); //自带验证,里面传验证字段
        if ($res) {
            return redirect('admin/index');
        } else {
            $request->session()->flash("errormsg", "用户名或密码错误");
            $this->incrementLoginAttempts($request);
            return redirect()->back();
        }
    }

//    退出登录

    public function logout(){
        if(Auth::logout()){
            return redirect('/admin/index');
        }else{
            return redirect('/admin/login');
        }
    }

    /**
     * 重写获取验证字段的方法
     * @return string
     */
    protected function username()
    {
        //判断是否定义了username,没有定义的话就用email
        return property_exists($this,'username')? $this->username : 'email';
    }

    /**
     *  记录登陆错误次数的session
     * @param Request $request
     * @return string
     */
    protected function throttleKey(Request $request)
    {
        //添加admin说明是后台的
        return Str::lower('admin.'.$request->input($this->username())).'|'.$request->ip();
    }
}
错误次数过多的提醒
上一篇 下一篇

猜你喜欢

热点阅读