付延余
2022-12-16 f0f8ee8c4a945adbc742d9bab69382b28ad311fb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
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);
        }
 
    }
 
}