• Laravel笔记-自定义登录中新增登录5次失败锁账户功能(提高系统安全性)


    这里用的登录就是阅读老外自定义登录和注册功能,用的是Laravel8,如果直接用这种上线,不太安全。如果被暴力破解,不断尝试就麻烦了,现在脚本小子太多了,门槛也低,普通人简单学习几天就能上手去恶心别人。这里我自己写了一个思路,不知道和php主流的是不是一样的。反正我写SpringBoot项目就是用的这种思路。

    首先建一个users_lock表

    其中这个users_email和users表对应,这里没有外键关系,相当于独立的,这里设计得不是很好,但感觉小站点用足够了。

    对应的SQL是这样的:

    1. CREATE TABLE `users_lock` (
    2. `user_email` varchar(255) NOT NULL,
    3. `login_num` int(11) DEFAULT 5,
    4. `last_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
    5. `lock_time` timestamp NULL DEFAULT NULL,
    6. PRIMARY KEY (`user_email`)
    7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

     注册时把这个表填充下,就好了。

    关键是登录时,我的逻辑是这样的:

    1. public function customLogin(Request $request)
    2. {
    3. $request->validate([
    4. 'email' => 'required|email',
    5. 'password' => 'required|min:6|max:128',
    6. 'captcha' => 'required|captcha'
    7. ]);
    8. //验证
    9. date_default_timezone_set('Asia/Shanghai');
    10. $userLock = UserLock::find($request['email']);
    11. if(!$userLock){
    12. return redirect()->back()->withErrors('用户名或密码不正确');
    13. }
    14. if($userLock['last_time'] < date('Y-m-d H:i:s',strtotime('-5 minute')) && $userLock['login_num'] <= 0){
    15. $userLock['login_num'] = 5;
    16. $userLock->save();
    17. }
    18. //锁
    19. if($userLock['login_num'] <= 0){
    20. return redirect()->back()->withErrors('帐号锁定,解锁时间 ' . $userLock['lock_time']);
    21. }
    22. $credentials = $request->only('email', 'password');
    23. if (Auth::attempt($credentials)) {
    24. return redirect()->intended('dashboard')
    25. ->withSuccess('Signed in');
    26. }
    27. //次数
    28. $userLock['login_num'] -= 1;
    29. if($userLock['login_num'] <= 0){
    30. $userLock['lock_time'] = date('Y-m-d H:i:s',strtotime('+5 minute'));
    31. }
    32. $userLock->save();
    33. return redirect()->back()->withErrors('用户名或密码错误');
    34. }

    逻辑:

    ①先检测users_lock中是否有存在此用户,如果有继续,如果没有,就直接返回;

    ②判断尝试次数是否为0,如果为0,并且last_time,过期(比当前时间-5分钟要小),就把尝试次数,重新设置为5。

    (这里是没有办法的办法,如果有条件的朋友,建议用调度线程去弄,每5分钟跑一次,或者直接用数据库的定时器)

    ③当login_time为0时,说明帐号已经被锁了。

    ④使用Laravel的Auth去验证用户名密码。

    ⑤登录次数-5,如果登录次数<=0就锁账户,锁到当前时间+5分钟。

    这里UserLock类是这样的:

    1. <?php
    2. namespace App\Models;
    3. use Illuminate\Database\Eloquent\Model;
    4. class UserLock extends Model
    5. {
    6. protected $table = "users_lock";
    7. protected $primaryKey = 'user_email';
    8. protected $keyType = 'string';
    9. public $timestamps = false;
    10. }

    用起来还可以:

     

  • 相关阅读:
    vsftpd 操作手册 - 完整版
    【重铸Java根基】J集合相关知识点
    我要写整个中文互联网界最牛逼的JVM系列教程 | 「JVM与Java体系架构」章节:JVM的发展历程
    烧写最小linux失败,开机显示Wrong Ramdisk Image Format
    降温了好冷,总结下11月
    六月集训(第28天) —— 动态规划
    深度学习 Day 17——利用卷神经网络实现猫狗识别
    使用Navicat对比多环境数据库数据差异和结构差异,以及自动DML和DDL脚本
    【Android】性能优化之内存、网络、布局、卡顿、安装包、启动速度优化
    大学生旅游风景主题dreamweaver网页设计大作业-陕西渭南HTML+CSS制作网页
  • 原文地址:https://blog.csdn.net/qq78442761/article/details/125632181