LoginController.java 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package com.iamberry.wechat.handles.admin;
  2. import com.iamberry.sys.Admin;
  3. import com.iamberry.wechat.face.mq.MQSerivce;
  4. import com.iamberry.wechat.face.sys.SysService;
  5. import com.iamberry.wechat.realm.IamberryRealm;
  6. import com.iamberry.wechat.tools.ResponseJson;
  7. import com.iamberry.wechat.utils.AdminUtils;
  8. import com.iamberry.wechat.utils.VerifyCodeUtil;
  9. import org.apache.shiro.SecurityUtils;
  10. import org.apache.shiro.authc.LockedAccountException;
  11. import org.apache.shiro.authc.UnknownAccountException;
  12. import org.apache.shiro.authc.UsernamePasswordToken;
  13. import org.apache.shiro.subject.Subject;
  14. import org.slf4j.Logger;
  15. import org.slf4j.LoggerFactory;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.stereotype.Controller;
  18. import org.springframework.web.bind.annotation.RequestMapping;
  19. import org.springframework.web.bind.annotation.RequestParam;
  20. import org.springframework.web.bind.annotation.ResponseBody;
  21. import org.springframework.web.servlet.ModelAndView;
  22. import javax.imageio.ImageIO;
  23. import javax.servlet.http.HttpServletRequest;
  24. import javax.servlet.http.HttpServletResponse;
  25. import java.awt.*;
  26. import java.awt.image.BufferedImage;
  27. import java.io.IOException;
  28. import java.util.Random;
  29. /**
  30. * @author 献
  31. * @company 深圳爱贝源科技有限公司
  32. * @website www.iamberry.com
  33. * @tel 18271840547
  34. * @date 2017/5/12
  35. */
  36. @Controller
  37. public class LoginController {
  38. private static Logger logger = LoggerFactory.getLogger(LoginController.class);
  39. @Autowired
  40. private SysService sysService;
  41. @Autowired
  42. private IamberryRealm iamberryRealm;
  43. @RequestMapping("/_login")
  44. public ModelAndView loginUI(HttpServletRequest request) {
  45. // 判断用户是否登录,如果已经登录,则跳转
  46. Subject currentUser = SecurityUtils.getSubject();
  47. if (!currentUser.isAuthenticated()) {
  48. // 判断是否已经记住过密码
  49. Admin admin = AdminUtils.getAdminCookie(request);
  50. if (admin == null) {
  51. return new ModelAndView("login");
  52. }
  53. try {
  54. // 执行登录.
  55. currentUser.login(new UsernamePasswordToken(admin.getAdminAccount(), admin.getAdminPassword().toUpperCase()));
  56. } catch (Exception e) {
  57. logger.error("", e);
  58. return new ModelAndView("login");
  59. }
  60. }
  61. // 已登陆
  62. return new ModelAndView("redirect:/admin/sys/_index");
  63. }
  64. @ResponseBody
  65. @RequestMapping("/get_salt")
  66. public ResponseJson getSalt(@RequestParam("login_name") String login_name) {
  67. // 获取用户的盐值
  68. String salt = sysService.getSaltByLoginName(login_name);
  69. if (salt == null || "".equals(salt)) {
  70. return new ResponseJson(200, "SUCCESS", 400);
  71. }
  72. return new ResponseJson(200, "SUCCESS", 200).addResponseKeyValue("salt", salt);
  73. }
  74. @ResponseBody
  75. @RequestMapping("/loginShiro")
  76. public ResponseJson loginShiro(HttpServletRequest request,
  77. HttpServletResponse response,
  78. @RequestParam("login_name") String loginName,
  79. @RequestParam("login_pwd") String loginPwd,
  80. @RequestParam("login_code") String loginCode,
  81. @RequestParam(value = "remember_me", required = false, defaultValue = "false") String rememberMe) {
  82. // 判断 验证码是否有误
  83. Object temp = request.getSession().getAttribute("login_code");
  84. if (temp == null || !loginCode.equalsIgnoreCase(temp.toString())) {
  85. return new ResponseJson(200, "VERIFY_CODE_ERROR", 400);
  86. }
  87. // 调用Shiro登录
  88. Subject currentUser = SecurityUtils.getSubject();
  89. if (!currentUser.isAuthenticated()) {
  90. try {
  91. // 执行登录.
  92. currentUser.login(new UsernamePasswordToken(loginName, loginPwd.toUpperCase()));
  93. }
  94. catch (UnknownAccountException ue) {
  95. // 没有这个用户
  96. return new ResponseJson(200, "NOT_ADMIN", 404);
  97. }
  98. catch (LockedAccountException le) {
  99. // 账户被锁定
  100. return new ResponseJson(200, "ADMIN_LOCKED", 403);
  101. }
  102. catch (Exception ae) {
  103. // 所有认证时异常的父类.
  104. return new ResponseJson(200, "LOGIN_ERROR", 500);
  105. }
  106. }
  107. // 是否需要记住密码
  108. if ("true".equals(rememberMe)) {
  109. AdminUtils.saveAdminToCookie(AdminUtils.getLoginAdminId(), loginName, loginPwd.toUpperCase(), response);
  110. }
  111. // 登录成功
  112. return new ResponseJson(200, "SUCCESS", 200);
  113. }
  114. /**
  115. * 验证码
  116. * @param response
  117. * @param request
  118. * @throws IOException
  119. */
  120. @RequestMapping(value = "/security_code")
  121. public void securityCode(HttpServletResponse response, HttpServletRequest request,
  122. @RequestParam(value = "len", required = false, defaultValue = "6") Integer len) throws IOException {
  123. // 生成随机的验证码
  124. String verifyCode = VerifyCodeUtil.generateTextCode(3, len, null);
  125. // 保存
  126. request.getSession().setAttribute("login_code", verifyCode);
  127. // 输出到Response
  128. response.setContentType("image/jpeg");
  129. BufferedImage bufferedImage = VerifyCodeUtil.generateImageCode(verifyCode, 130, 40, new Random().nextInt(50), true, Color.WHITE, Color.BLACK, null);
  130. // 使用ServletOutputStream,要比PrintWrite快
  131. ImageIO.write(bufferedImage, "JPEG", response.getOutputStream());
  132. }
  133. @RequestMapping("/_exit")
  134. public ModelAndView exit(HttpServletRequest request) {
  135. // Shiro退出
  136. Subject subject = SecurityUtils.getSubject();
  137. if (subject.isAuthenticated()) {
  138. // 清空缓存的权限
  139. iamberryRealm.getAuthorizationCache().remove(subject);
  140. subject.logout();
  141. }
  142. // 返回Login页面
  143. return new ModelAndView("login");
  144. }
  145. }