package com.wgcloud.controller; import com.wgcloud.config.CommonConfig; import com.wgcloud.entity.AccountInfo; import com.wgcloud.service.AccountInfoService; import com.wgcloud.service.LogInfoService; import com.wgcloud.util.IpUtil; import com.wgcloud.util.MD5Utils; import com.wgcloud.util.ThreadPoolUtil; import com.wgcloud.util.msg.WarnMailUtil; import com.wgcloud.util.staticvar.StaticKeys; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @version v3.3 * @ClassName:LoginController.java * @author: http://www.wgstart.com * @date: 2021年1月16日 * @Description: 登陆处理 * @Copyright: 2019-2021 wgcloud. All rights reserved. */ @Controller @RequestMapping(value = "/login") public class LoginController { private static final Logger logger = LoggerFactory.getLogger(LoginController.class); //禁止登录标识 private static final String USER_BLOCK = "block"; @Resource private LogInfoService logInfoService; @Resource private AccountInfoService accountInfoService; @Resource private CommonConfig commonConfig; private void testThread() { Runnable runnable = () -> { logger.info("LoginCotroller----------testThread"); }; ThreadPoolUtil.executor.execute(runnable); } /** * 转向到登录页面 * * @param model * @param request * @return */ @RequestMapping("toLogin") public String toLogin(Model model, HttpServletRequest request) { return "login/login"; } /** * 登出系统 * * @param model * @param request * @return */ @RequestMapping("loginOut") public String loginOut(Model model, HttpServletRequest request) { HttpSession session = request.getSession(); session.invalidate(); return "redirect:/login/toLogin"; } /** * 管理员登录验证 * * @param model * @param request * @return */ @RequestMapping(value = "login") public String login(Model model, HttpServletRequest request) { String userName = request.getParameter("userName"); String userBlock = StaticKeys.LOGIN_BLOCK_MAP.get(userName); if (USER_BLOCK.equals(userBlock)) { model.addAttribute("error", "请10分钟后登录该账号或者联系管理员"); return "login/login"; } String passwd = request.getParameter("md5pwd"); HttpSession session = request.getSession(); try { if (!StringUtils.isEmpty(userName) && !StringUtils.isEmpty(passwd)) { passwd = passwd.toLowerCase(); AccountInfo accountInfo = new AccountInfo(); //管理员账号登陆 begin if (MD5Utils.GetMD5Code(commonConfig.getAccountPwd()).equals(passwd) && commonConfig.getAccount().equals(userName)) { accountInfo.setAccount(userName); accountInfo.setId(userName); accountInfo.setRole(StaticKeys.ROLE_ADMIN); request.getSession().setAttribute(StaticKeys.LOGIN_KEY, accountInfo); return "redirect:/dash/main"; } //管理员账号登陆 end //只读账号登陆,专业版功能 begin if (MD5Utils.GetMD5Code(commonConfig.getGuestAccountPwd()).equals(passwd) && commonConfig.getGuestAccount().equals(userName)) { accountInfo.setAccount(userName); accountInfo.setId(userName); accountInfo.setRole(StaticKeys.ROLE_GUEST); request.getSession().setAttribute(StaticKeys.LOGIN_KEY, accountInfo); return "redirect:/dash/main"; } //只读账号登陆 end //普通账号登陆,专业版功能 begin if (StaticKeys.TRUE_VAL.equals(commonConfig.getUserInfoManage())) { Map params = new HashMap(); params.put("account", userName); params.put("passwd", passwd); List userList = accountInfoService.selectAllByParams(params); if (userList.size() > 0) { accountInfo.setAccount(userName); accountInfo.setId(userName); accountInfo.setRole(StaticKeys.ROLE_USER); request.getSession().setAttribute(StaticKeys.LOGIN_KEY, accountInfo); return "redirect:/dash/main"; } } //普通账号登陆 end } } catch (Exception e) { logger.error("登录异常", e); } model.addAttribute("error", "账号或者密码错误"); //处理连续5次输入错误密码,10分钟内禁止登录 loginErrorHandle(request, model); return "login/login"; } /** * 处理连续5次输入错误密码,10分钟内禁止登录 * * @param request */ private void loginErrorHandle(HttpServletRequest request, Model model) { String requestIp = IpUtil.getIpAddr(request); String userName = request.getParameter("userName"); Integer errorCount = StaticKeys.LOGIN_ERROR_MAP.get(userName); if (errorCount != null) { StaticKeys.LOGIN_ERROR_MAP.put(userName, errorCount + 1); } else { errorCount = 1; StaticKeys.LOGIN_ERROR_MAP.put(userName, errorCount); } if (errorCount >= 2) { //输入密码3次错误提示 model.addAttribute("error", "账号或密码错误,若连续5次输入错误,需等10分钟后才能再登录该账号"); } if (errorCount >= 5) { //输入密码6次错误提示和处理,10分钟内禁止登录 StaticKeys.LOGIN_BLOCK_MAP.put(userName, USER_BLOCK); String errMsg = userName + "密码已连续5次输入错误,10分钟内禁止登录,登录IP:" + requestIp; //发送告警 Runnable runnable = () -> { try { WarnMailUtil.sendUtil(errMsg, errMsg, userName, userName + "_longError", true); } catch (Exception e) { e.printStackTrace(); } }; ThreadPoolUtil.executor.execute(runnable); model.addAttribute("error", "密码已连续5次输入错误,请10分钟后再登录该账号"); logger.error(errMsg); } } }