瀏覽代碼

登录失败次数校验

lyhzzz 2 年之前
父節點
當前提交
5609f11881

+ 3 - 0
src/main/java/com/fdkankan/manage/common/RedisKeyUtil.java

@@ -12,4 +12,7 @@ public class RedisKeyUtil {
 
 
     public static final String QRCODE= "4dkankan:qr_code:";
     public static final String QRCODE= "4dkankan:qr_code:";
 
 
+    public static final String loginNum= "manage:login:userName:%s:ip:%s";
+
+
 }
 }

+ 7 - 2
src/main/java/com/fdkankan/manage/controller/LoginController.java

@@ -1,8 +1,11 @@
 package com.fdkankan.manage.controller;
 package com.fdkankan.manage.controller;
 
 
+import cn.hutool.extra.servlet.ServletUtil;
+import com.dtflys.forest.annotation.BaseRequest;
 import com.fdkankan.common.response.ResultData;
 import com.fdkankan.common.response.ResultData;
 import com.fdkankan.manage.service.impl.ManageService;
 import com.fdkankan.manage.service.impl.ManageService;
 import com.fdkankan.manage.vo.request.ManageLoginRequest;
 import com.fdkankan.manage.vo.request.ManageLoginRequest;
+import com.fdkankan.redis.util.RedisUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
@@ -11,7 +14,7 @@ import org.springframework.web.bind.annotation.*;
  */
  */
 @RestController
 @RestController
 @RequestMapping("/service/manage/")
 @RequestMapping("/service/manage/")
-public class LoginController {
+public class LoginController extends BaseController {
 
 
 
 
     @Autowired
     @Autowired
@@ -22,7 +25,9 @@ public class LoginController {
      */
      */
     @PostMapping("/login")
     @PostMapping("/login")
     public ResultData login(@RequestBody ManageLoginRequest param) {
     public ResultData login(@RequestBody ManageLoginRequest param) {
-        return ResultData.ok(manageService.login(param.getUserName(),param.getPassword()));
+        String clientIP = ServletUtil.getClientIP(request);
+
+        return ResultData.ok(manageService.login(clientIP,param.getUserName(),param.getPassword()));
     }
     }
     /**
     /**
      * 登出
      * 登出

+ 23 - 1
src/main/java/com/fdkankan/manage/service/impl/ManageService.java

@@ -2,13 +2,16 @@ package com.fdkankan.manage.service.impl;
 
 
 import cn.dev33.satoken.stp.SaLoginConfig;
 import cn.dev33.satoken.stp.SaLoginConfig;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.extra.servlet.ServletUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.fdkankan.common.constant.ErrorCode;
 import com.fdkankan.common.constant.ErrorCode;
 import com.fdkankan.common.util.Base64Converter;
 import com.fdkankan.common.util.Base64Converter;
 import com.fdkankan.common.util.SecurityUtil;
 import com.fdkankan.common.util.SecurityUtil;
+import com.fdkankan.manage.common.RedisKeyUtil;
 import com.fdkankan.manage.common.ResultCode;
 import com.fdkankan.manage.common.ResultCode;
 import com.fdkankan.manage.exception.BusinessException;
 import com.fdkankan.manage.exception.BusinessException;
 import com.fdkankan.manage.service.ISysUserService;
 import com.fdkankan.manage.service.ISysUserService;
+import com.fdkankan.manage.vo.request.ManageLoginRequest;
 import com.fdkankan.manage.vo.response.ManageLoginResponse;
 import com.fdkankan.manage.vo.response.ManageLoginResponse;
 import com.fdkankan.redis.constant.RedisKey;
 import com.fdkankan.redis.constant.RedisKey;
 import com.fdkankan.redis.util.RedisUtil;
 import com.fdkankan.redis.util.RedisUtil;
@@ -16,6 +19,8 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import javax.servlet.http.HttpServletRequest;
+
 @Service
 @Service
 public class ManageService {
 public class ManageService {
 
 
@@ -25,7 +30,7 @@ public class ManageService {
     RedisUtil redisUtil;
     RedisUtil redisUtil;
 
 
 
 
-    public ManageLoginResponse login(String userName, String password) {
+    public ManageLoginResponse login(String ip,String userName, String password) {
         if(StringUtils.isBlank(userName) || StringUtils.isBlank(password)){
         if(StringUtils.isBlank(userName) || StringUtils.isBlank(password)){
             throw new BusinessException(ErrorCode.MISSING_REQUIRED_PARAMETERS);
             throw new BusinessException(ErrorCode.MISSING_REQUIRED_PARAMETERS);
         }
         }
@@ -33,6 +38,7 @@ public class ManageService {
         String passwordMd5 = SecurityUtil.MD52(Base64Converter.decode(Base64Converter.subText(password)));
         String passwordMd5 = SecurityUtil.MD52(Base64Converter.decode(Base64Converter.subText(password)));
         ManageLoginResponse result = sysUserService.getUserByUserNameAndPassword(userName, passwordMd5);
         ManageLoginResponse result = sysUserService.getUserByUserNameAndPassword(userName, passwordMd5);
         if(result == null){
         if(result == null){
+            this.checkLoginNum(ip,userName);
             throw new BusinessException(ResultCode.PASSWORD_ERROR);
             throw new BusinessException(ResultCode.PASSWORD_ERROR);
         }
         }
         StpUtil.login(result.getId(), SaLoginConfig
         StpUtil.login(result.getId(), SaLoginConfig
@@ -51,4 +57,20 @@ public class ManageService {
         redisUtil.del(String.format(RedisKey.TOKEN_V3 ,StpUtil.getTokenValue()));
         redisUtil.del(String.format(RedisKey.TOKEN_V3 ,StpUtil.getTokenValue()));
         StpUtil.logout();
         StpUtil.logout();
     }
     }
+
+    public void checkLoginNum(String ip, String userName) {
+        if(StringUtils.isNotBlank(userName)){
+            String redisKey = String.format(RedisKeyUtil.loginNum,userName,ip);
+            if(redisUtil.hasKey(redisKey)){
+                String value = redisUtil.get(redisKey);
+                if("5".equals(value)){
+                    throw new BusinessException(-1,"频繁登录失败,请五分钟后再次尝试登录");
+                }
+                Integer num = Integer.parseInt(value) + 1;
+                redisUtil.set(redisKey,num.toString());
+            }else {
+                redisUtil.set(redisKey,"1",60);
+            }
+        }
+    }
 }
 }