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<String, Object> params = new HashMap<String, Object>();
|
params.put("account", userName);
|
params.put("passwd", passwd);
|
List<AccountInfo> 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);
|
}
|
|
}
|
|
}
|