LoginController.java 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. package com.bootdo.system.controller;
  2. import com.bootdo.common.annotation.Log;
  3. import com.bootdo.common.config.BootdoConfig;
  4. import com.bootdo.common.constant.Constants;
  5. import com.bootdo.common.controller.BaseController;
  6. import com.bootdo.common.domain.FileDO;
  7. import com.bootdo.common.domain.Tree;
  8. import com.bootdo.common.service.FileService;
  9. import com.bootdo.common.token.Payload;
  10. import com.bootdo.common.token.Token;
  11. import com.bootdo.common.token.TokenUtil;
  12. import com.bootdo.common.utils.*;
  13. import com.bootdo.system.domain.MenuDO;
  14. import com.bootdo.system.domain.UserDO;
  15. import com.bootdo.system.service.MenuService;
  16. import com.bootdo.system.service.SessionService;
  17. import org.apache.shiro.SecurityUtils;
  18. import org.apache.shiro.authc.UsernamePasswordToken;
  19. import org.apache.shiro.subject.Subject;
  20. import org.slf4j.Logger;
  21. import org.slf4j.LoggerFactory;
  22. import org.springframework.beans.factory.annotation.Autowired;
  23. import org.springframework.beans.factory.annotation.Value;
  24. import org.springframework.stereotype.Controller;
  25. import org.springframework.ui.Model;
  26. import org.springframework.util.ObjectUtils;
  27. import org.springframework.web.bind.annotation.*;
  28. import javax.annotation.Resource;
  29. import javax.servlet.http.HttpServletRequest;
  30. import javax.servlet.http.HttpServletResponse;
  31. import java.util.List;
  32. import java.util.Objects;
  33. @Controller
  34. public class LoginController extends BaseController {
  35. private final Logger logger = LoggerFactory.getLogger(this.getClass());
  36. @Autowired
  37. MenuService menuService;
  38. @Autowired
  39. FileService fileService;
  40. @Autowired
  41. BootdoConfig bootdoConfig;
  42. @Value("${sysProvince:#{null}}")
  43. public String sysProvince;
  44. @Value("${sysCity:#{null}}")
  45. public String sysCity;
  46. //登录地址
  47. @Value("${login_url:#{null}}")
  48. public String loginUrl;
  49. @Value("${oauth_permission_authentication.prefix:#{null}}")
  50. private String permAuthPrefix;
  51. @Value("${uniform_identity_authentication.appId:#{null}}")
  52. private String uniIdentAuthAppId;
  53. @Value("${logout.redirect_url:#{null}}")
  54. private String logoutRedirectUrl;
  55. @Autowired
  56. private SessionService sessionService;
  57. @Resource
  58. private TokenUtil tokenUtil;
  59. @Resource
  60. private RedisUtil redisUtil;
  61. @GetMapping({"/", ""})
  62. String welcome(Model model) {
  63. boolean bl = LicenseUtil.checkLicense();
  64. if (bl) {
  65. return "redirect:/login";
  66. } else {
  67. return "redirect:/checkLicense";
  68. }
  69. }
  70. @Log("请求访问主页")
  71. @GetMapping({"/index"})
  72. String index(@RequestParam("sysFlag") String sysFlag, Model model) {
  73. List<Tree<MenuDO>> menus = menuService.listMenuTree(sysFlag,getUserId());
  74. model.addAttribute("menus", menus);
  75. model.addAttribute("name", getUser().getName());
  76. FileDO fileDO = fileService.get(getUser().getPicId());
  77. if (fileDO != null && fileDO.getUrl() != null) {
  78. if (fileService.isExist(fileDO.getUrl())) {
  79. model.addAttribute("picUrl", "/img/photo_s.png");
  80. } else {
  81. model.addAttribute("picUrl", "/img/photo_s.png");
  82. }
  83. } else {
  84. model.addAttribute("picUrl", "/img/photo_s.png");
  85. }
  86. UserDO currUser = ShiroUtils.getUser();
  87. logger.info("province:" + currUser.getProvince());
  88. logger.info("User:" + currUser.getDeptId() + ",deptName:" + currUser.getDeptName());
  89. model.addAttribute("username", currUser.getUsername());
  90. model.addAttribute("hiddenFlag", "");
  91. model.addAttribute("loadURl", "home");
  92. return "index_v1";
  93. }
  94. @GetMapping("/home")
  95. String home() {
  96. if("四川省".equals(sysProvince)){
  97. return "home_sichuan";
  98. } else if("湖南省".equals(sysProvince)){
  99. return "home_hunan";
  100. } else {
  101. return "error/404";
  102. }
  103. }
  104. @ResponseBody
  105. @GetMapping("/getLoginUrl")
  106. String getLoginUrl() {
  107. //return loginUrl;
  108. //获取当前登录账号信息
  109. UserDO currUser = ShiroUtils.getUser();
  110. if(!ObjectUtils.isEmpty(logoutRedirectUrl) && logoutRedirectUrl.contains("https")){
  111. //返回第三方退出登录接口
  112. //回调地址示例:https://testmicrosrv.scca.com.cn:9668/session/end?client_id=f104472f-02f4-6ab6-f6dc&access_token=HRMpcEUueorxSGQccNolRB2vkpaxnWHGvQonRtnoKEr3Z7KQthcUFz8jdaSD&logout_redirect_uri=http://124.70.58.209:19087/login
  113. String logoutRedirectBackUrl = permAuthPrefix + "/session/end" +
  114. "?client_id=" + this.uniIdentAuthAppId +
  115. "&access_token=" + redisUtil.hget(Constants.USERNAME_ACCESS_TOKEN, currUser.getUsername()) +
  116. "&logout_redirect_uri=" + this.logoutRedirectUrl;
  117. logger.error("logoutRedirectBackUrl==============="+logoutRedirectBackUrl);
  118. return "redirect:" + logoutRedirectBackUrl;
  119. }else {
  120. return loginUrl;
  121. }
  122. }
  123. @GetMapping("/login")
  124. String login() {
  125. boolean bl = LicenseUtil.checkLicense();
  126. if (bl) {
  127. return "login";
  128. } else {
  129. return "checkLicense";
  130. }
  131. }
  132. @Log("登录")
  133. @PostMapping("/login")
  134. @ResponseBody
  135. R ajaxLogin(String username, String password, String verify, HttpServletRequest request) {
  136. try {
  137. // 从session中获取随机数
  138. String random = (String)request.getSession().getAttribute(RandomValidateCodeUtil.RANDOMCODEKEY);
  139. if (StringUtils.isBlank(verify)) {
  140. return R.error("请输入验证码");
  141. }
  142. if (random.equalsIgnoreCase(verify)) {
  143. }
  144. // else if ("6666".equals(verify)) {
  145. // }
  146. else {
  147. return R.error("请输入正确的验证码");
  148. }
  149. } catch (Exception e) {
  150. logger.error("验证码校验失败", e);
  151. return R.error("验证码校验失败");
  152. }
  153. password = MD5Utils.encrypt(username, password);
  154. UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(username, password);
  155. Subject subject = SecurityUtils.getSubject();
  156. try {
  157. subject.login(usernamePasswordToken);
  158. return R.ok();
  159. } catch (Exception e) {
  160. return R.error("用户或密码错误");
  161. }
  162. }
  163. @Log("单点登录")
  164. @GetMapping("/ssoLogin")
  165. String ssoLogin(String token) {
  166. try {
  167. if(ObjectUtils.isEmpty(token)){
  168. throw new Exception("token不能为空");
  169. }
  170. Token tokenObj = tokenUtil.getToken(token);
  171. if(ObjectUtils.isEmpty(tokenObj) || !tokenUtil.verifyToken(tokenObj)){
  172. throw new Exception("token无效");
  173. }
  174. Payload payload = tokenObj.getPayload();
  175. String username = payload.getUsername();
  176. String password = payload.getPassword();
  177. UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(username, password);
  178. Subject subject = SecurityUtils.getSubject();
  179. subject.login(usernamePasswordToken);
  180. return "ssoLogin";
  181. } catch (Exception e) {
  182. e.printStackTrace();
  183. return "login";
  184. }
  185. }
  186. @GetMapping("/logout")
  187. String logout() {
  188. logger.error("logout======in==="+logoutRedirectUrl);
  189. //获取当前登录账号信息
  190. UserDO currUser = ShiroUtils.getUser();
  191. //正常退出
  192. try {
  193. sessionService.logout();
  194. } catch (Exception e){
  195. e.printStackTrace();
  196. }
  197. if(!ObjectUtils.isEmpty(logoutRedirectUrl) && logoutRedirectUrl.contains("http") && "四川省".equals(sysProvince)){
  198. //该路径只对四川省版本有效
  199. logger.error("logout======not null==="+logoutRedirectUrl);
  200. //返回第三方退出登录接口
  201. //回调地址示例:https://testmicrosrv.scca.com.cn:9668/session/end?client_id=f104472f-02f4-6ab6-f6dc&access_token=HRMpcEUueorxSGQccNolRB2vkpaxnWHGvQonRtnoKEr3Z7KQthcUFz8jdaSD&logout_redirect_uri=http://124.70.58.209:19087/login
  202. String logoutRedirectBackUrl = permAuthPrefix + "/session/end" +
  203. "?client_id=" + this.uniIdentAuthAppId +
  204. "&access_token=" + redisUtil.hget(Constants.USERNAME_ACCESS_TOKEN, currUser.getUsername()) +
  205. "&logout_redirect_uri=" + this.logoutRedirectUrl;
  206. logger.error("logoutRedirectBackUrl========end======="+logoutRedirectBackUrl);
  207. return "redirect:" + logoutRedirectBackUrl;
  208. }else {
  209. logger.error("logout======is null==="+logoutRedirectUrl);
  210. return "redirect:" + loginUrl;
  211. }
  212. }
  213. @GetMapping("/main")
  214. String main() {
  215. return "main";
  216. }
  217. /**
  218. * 生成验证码
  219. */
  220. @GetMapping(value = "/getVerify")
  221. public void getVerify(HttpServletRequest request, HttpServletResponse response) {
  222. try {
  223. response.setContentType("image/jpeg");// 设置相应类型,告诉浏览器输出的内容为图片
  224. response.setHeader("Pragma", "No-cache");// 设置响应头信息,告诉浏览器不要缓存此内容
  225. response.setHeader("Cache-Control", "no-cache");
  226. response.setDateHeader("Expire", 0);
  227. RandomValidateCodeUtil randomValidateCode = new RandomValidateCodeUtil();
  228. randomValidateCode.getRandcode(request, response);// 输出验证码图片方法
  229. } catch (Exception e) {
  230. logger.error("获取验证码失败>>>> ", e);
  231. }
  232. }
  233. @GetMapping("/code")
  234. @ResponseBody
  235. boolean code() {
  236. return !Objects.isNull(ShiroUtils.getUser());
  237. }
  238. }