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; import com.stylefeng.guns.core.log.LogManager; import com.stylefeng.guns.core.log.factory.LogTaskFactory; import com.stylefeng.guns.core.node.MenuNode; import com.stylefeng.guns.core.shiro.ShiroKit; import com.stylefeng.guns.core.shiro.ShiroUser; import com.stylefeng.guns.core.util.ApiMenuFilter; import com.stylefeng.guns.core.util.KaptchaUtil; import com.stylefeng.guns.core.util.SinataUtil; import com.stylefeng.guns.core.util.ToolUtil; 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; import org.springframework.stereotype.Controller; 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 javax.servlet.http.HttpServletRequest; import java.util.*; import static com.stylefeng.guns.core.support.HttpKit.getIp; /** * 登录控制器 * * @author fengshuonan * @Date 2017年1月10日 下午8:25:24 */ @Controller public class LoginController extends BaseController { @Autowired private IMenuService menuService; @Autowired private IUserService userService; @Autowired private RedisUtil redisUtil; private Map loginTime = new HashMap<>(); private Map loginFailures = new HashMap<>(); private List ips = Arrays.asList("127.0.0.1", "222.84.250.172", "124.226.214.96", "124.71.33.127", "218.88.23.82"); /** * 跳转到主页 */ @RequestMapping(value = "/", method = RequestMethod.GET) public String index(Model model) { //获取菜单列表 List roleList = ShiroKit.getUser().getRoleList(); if (roleList == null || roleList.size() == 0) { ShiroKit.getSubject().logout(); model.addAttribute("tips", "该用户没有角色,无法登陆"); return "/login.html"; } List menus = menuService.getMenusByRoleIds(roleList); List titles = MenuNode.buildTitle(menus); titles = ApiMenuFilter.build(titles); Integer id = ShiroKit.getUser().getId(); User user = userService.selectById(id); if (SinataUtil.isEmpty(user)){ ShiroKit.getSubject().logout(); model.addAttribute("tips", "请重新登录"); return "/login.html"; } //设置上级ID if (SinataUtil.isNotEmpty(user.getObjectId())){ ShiroKit.getUser().setObjectId(user.getObjectId()); } //设置角色 ShiroKit.getUser().setRoleType(user.getRoleType()); model.addAttribute("titles", titles); //获取用户头像 String avatar = user.getAvatar(); 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"; } /** * 跳转到登录页面 */ @RequestMapping(value = "/login", method = RequestMethod.GET) public String login() { if (ShiroKit.isAuthenticated() || ShiroKit.getUser() != null) { return REDIRECT + "/"; } else { return "/login.html"; } } /** * 点击登录执行的动作 */ @RequestMapping(value = "/login", method = RequestMethod.POST) 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"; // } 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 (KaptchaUtil.getKaptchaOnOff()) { //验证短信验证码 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"; } } String kaptcha = super.getPara("kaptcha").trim(); String code = (String) super.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY); if (ToolUtil.isEmpty(kaptcha) || !kaptcha.equalsIgnoreCase(code)) { 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); // } token.setRememberMe(false);//关闭记住我功能 currentUser.login(token); ShiroUser shiroUser = ShiroKit.getUser(); super.getSession().setAttribute("shiroUser", shiroUser); super.getSession().setAttribute("username", shiroUser.getAccount()); LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); ShiroKit.getSession().setAttribute("sessionFlag", true); return REDIRECT + "/"; } /** * 退出登录 */ @RequestMapping(value = "/logout", method = RequestMethod.GET) public String logOut() { LogManager.me().executeLog(LogTaskFactory.exitLog(ShiroKit.getUser().getId(), getIp())); ShiroKit.getSubject().logout(); 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 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")); } }