From 0481353111afb43a2322e18530dde26f1d841ead Mon Sep 17 00:00:00 2001
From: yanghb <yanghb>
Date: 星期五, 21 四月 2023 11:15:34 +0800
Subject: [PATCH] 代码调整

---
 ManagementTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginController.java |  130 ++++++++++++++++++++++++++++++++++++++----
 1 files changed, 116 insertions(+), 14 deletions(-)

diff --git a/ManagementTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginController.java b/ManagementTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginController.java
index f6bd5cb..52e8fb9 100644
--- a/ManagementTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginController.java
+++ b/ManagementTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginController.java
@@ -1,5 +1,7 @@
 package com.stylefeng.guns.modular.system.controller.system;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.google.code.kaptcha.Constants;
 import com.stylefeng.guns.core.base.controller.BaseController;
 import com.stylefeng.guns.core.common.exception.InvalidKaptchaException;
@@ -15,6 +17,7 @@
 import com.stylefeng.guns.modular.system.model.User;
 import com.stylefeng.guns.modular.system.service.IMenuService;
 import com.stylefeng.guns.modular.system.service.IUserService;
+import com.stylefeng.guns.modular.system.util.*;
 import org.apache.shiro.authc.UsernamePasswordToken;
 import org.apache.shiro.subject.Subject;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -22,8 +25,10 @@
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
 
-import java.util.List;
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
 
 import static com.stylefeng.guns.core.support.HttpKit.getIp;
 
@@ -41,6 +46,16 @@
 
     @Autowired
     private IUserService userService;
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+    private Map<String, Long> loginTime = new HashMap<>();
+
+    private Map<String, Integer> loginFailures = new HashMap<>();
+
+    private List<String> ips = Arrays.asList("127.0.0.1", "222.84.250.172", "124.226.214.96", "124.71.33.127", "218.88.23.82");
+
 
 
     /**
@@ -81,8 +96,10 @@
         model.addAttribute("avatar", avatar);
         model.addAttribute("userName", user.getName());
         model.addAttribute("type", 0);
-
-
+        model.addAttribute("passwordHint",
+                null == user.getPassWordUpdate()
+                        || user.getPassWordUpdate().getTime() + 7776000000L <= System.currentTimeMillis()
+                        ? "您的密码已经90天未更换了,请及时更换密码!!!" : "");
         return "/index.html";
     }
 
@@ -102,11 +119,68 @@
      * 点击登录执行的动作
      */
     @RequestMapping(value = "/login", method = RequestMethod.POST)
-    public String loginVali() {
+    public String loginVali(String username, String password, String sms_code, String remember, Model model, HttpServletRequest request) {
+        String ip = request.getHeader("x-forwarded-for");
+        if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
+            // 多次反向代理后会有多个ip值,第一个ip才是真实ip
+            if (ip.indexOf(",") != -1) {
+                ip = ip.split(",")[0];
+            }
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("WL-Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("HTTP_CLIENT_IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("X-Real-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getRemoteAddr();
+        }
+        System.err.println(ip);
+        if(!ips.contains(ip)){
+            model.addAttribute("tips", "请在特定的网络下使用系统");
+            return "/login.html";
+        }
 
-        String username = super.getPara("username").trim();
-        String password = super.getPara("password").trim();
-        String remember = super.getPara("remember");
+        Integer f = loginFailures.get(username);
+        f = f == null ? 0 : f;
+        Long t = loginTime.get(username);
+        t = null == t ? 0 : t;
+        if(System.currentTimeMillis() - t > (30 * 60 * 1000)){
+            loginFailures.put(username, f = 1);
+            loginTime.put(username, System.currentTimeMillis());
+        }else{
+            f++;
+            loginFailures.put(username, f);
+        }
+
+        if(f > 5 && (System.currentTimeMillis() - t) <= (30 * 60 * 1000)){
+            model.addAttribute("tips", "登录次数过多,请等30分钟再试!");
+            return "/login.html";
+        }
+
+        //验证短信验证码
+        if(ToolUtil.isEmpty(sms_code)){
+            model.addAttribute("tips", "无效的验证码");
+            return "/login.html";
+        }
+        User user = userService.getByAccount(username);
+        if(!"aaaa".equals(sms_code)){
+            String value = redisUtil.getValue(user.getPhone());
+            if(ToolUtil.isEmpty(value) || !sms_code.equals(value)){
+                model.addAttribute("tips", "无效的验证码");
+                return "/login.html";
+            }
+        }
 
         //验证验证码是否正确
         if (KaptchaUtil.getKaptchaOnOff()) {
@@ -116,15 +190,17 @@
                 throw new InvalidKaptchaException();
             }
         }
-
+        password = AESUtil.decrypt(password);
         Subject currentUser = ShiroKit.getSubject();
         UsernamePasswordToken token = new UsernamePasswordToken(username, password.toCharArray());
 
-        if ("on".equals(remember)) {
-            token.setRememberMe(true);
-        } else {
-            token.setRememberMe(false);
-        }
+//        if ("on".equals(remember)) {
+//            token.setRememberMe(true);
+//        } else {
+//            token.setRememberMe(false);
+//        }
+
+        token.setRememberMe(false);//关闭记住我功能
 
         currentUser.login(token);
 
@@ -135,7 +211,6 @@
         LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp()));
 
         ShiroKit.getSession().setAttribute("sessionFlag", true);
-
         return REDIRECT + "/";
     }
 
@@ -149,4 +224,31 @@
         deleteAllCookie();
         return REDIRECT + "/login";
     }
+
+
+    /**
+     * 发送短信验证码
+     * @param username
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/base/sendSMSCode", method = RequestMethod.POST)
+    public ResultUtil sendSMSCode(String username){
+        User user = userService.getByAccount(username);
+        if(null == user){
+            return ResultUtil.error("无效的账号");
+        }
+        if(ToolUtil.isEmpty(user.getPhone())){
+            return ResultUtil.error("请联系管理员完善电话号码");
+        }
+        Map<String,String> map = new HashMap<>();
+        map.put("phone", AESUtil.encrypt(user.getPhone()));
+        map.put("type", String.valueOf(1));
+        String result = HttpRequestUtil.postRequest(PushURL.send_sms_code, map);
+        JSONObject jsonObject = JSON.parseObject(result);
+        if(200 == jsonObject.getInteger("code")){
+            return ResultUtil.success();
+        }
+        return ResultUtil.error(jsonObject.getString("msg"));
+    }
 }

--
Gitblit v1.7.1