From f65443d8abeaedc9d102324565e8368e7c9d90c8 Mon Sep 17 00:00:00 2001 From: 郑永安 <zyazyz250@sina.com> Date: 星期一, 19 六月 2023 14:41:54 +0800 Subject: [PATCH] commit --- src/main/java/com/gk/firework/Controller/LoginController.java | 442 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 442 insertions(+), 0 deletions(-) diff --git a/src/main/java/com/gk/firework/Controller/LoginController.java b/src/main/java/com/gk/firework/Controller/LoginController.java new file mode 100644 index 0000000..e232d6b --- /dev/null +++ b/src/main/java/com/gk/firework/Controller/LoginController.java @@ -0,0 +1,442 @@ +package com.gk.firework.Controller; + +import cn.hutool.core.lang.Dict; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpRequest; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.gk.firework.Config.Oauth2.IRedisService; +import com.gk.firework.Config.Oauth2.OauthRole; +import com.gk.firework.Config.Oauth2.RedisKeyEnum; +import com.gk.firework.Domain.AuthorizationInfo; +import com.gk.firework.Domain.Log.JsonParams; +import com.gk.firework.Domain.Utils.CommonUtil; +import com.gk.firework.Domain.Utils.Msg; +import com.gk.firework.Domain.Utils.StringUtils; +import com.gk.firework.Domain.Vo.UserVo; +import com.gk.firework.Service.AuthorizationService; +import com.gk.firework.Service.EnterpriseService; +import com.gk.firework.Service.UserService; +import com.google.common.base.Strings; +import com.google.common.net.HttpHeaders; +import io.jsonwebtoken.Claims; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.apache.commons.collections4.map.SingletonMap; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; +import springfox.documentation.annotations.ApiIgnore; + +import javax.servlet.http.HttpServletRequest; +import java.nio.charset.StandardCharsets; +import java.util.*; + +@Api(tags = "登录登出接口") +@RequestMapping("/auth") +@RestController +public class LoginController { + @Autowired + IRedisService redisService; + @Autowired + UserService userService; + @Autowired + AuthorizationService authorizationService; + @Autowired + EnterpriseService enterpriseService; + @Value("${host}") + private String host; + /** + * login produces = "application/json" + * + * @param jsonParam {"username":"用户名","password":"密码"} + * @return User + */ + @PostMapping("/login") + @JsonParams + @ApiOperation(value = "管理端登录授权", notes = "登录授权接口,获取token") + public Msg login(@ApiParam(value = "username,password") @RequestParam String encryptStr) { + String jsonStr = new String(Base64.getDecoder().decode(encryptStr), StandardCharsets.UTF_8); + JSONObject jsonParam = JSON.parseObject(jsonStr); + + String username = jsonParam.getString("username"); + String password = jsonParam.getString("password"); + + Msg msg = new Msg(); + msg.setCode("200"); + msg.setMessage("success"); + try { + //query user + UserVo user = userService.selectUserVoByName(username); + if (null == user) { + msg.setCode("100"); + msg.setMessage("用户不存在"); + return msg; + } + + if (user.getIssale() == 1) { + msg.setCode("100"); + msg.setMessage("用户不存在"); + return msg; + } + + if (StringUtils.isNotBlank(user.getCompanynumber()) && enterpriseService.isLogOut(user.getCompanynumber())) { + msg.setCode("166"); + msg.setMessage("用户已注销"); + return msg; + } + // 疆外日期判断 + Date now = new Date(); + if (user.getDeadline() != null) { + if (user.getDeadline().before(now)){ + // 当前已经疆外用户已经超期使用 需要缴费 + msg.setCode("200"); + msg.setMessage("疆外用户已过期,请及时联系续期"); + msg.setResult(new SingletonMap<>("deadline",user.getDeadline())); + return msg; + } + + } + + + //Call login interface + String rs = HttpRequest.post( host + "/oauth/token") + .setConnectionTimeout(10000) + .setReadTimeout(10000) + .header("Authorization", "Basic dWFhLXNlcnZpY2U6MTIzNDU2") + .form(Dict.create() + .set("username", username) + .set("password", password) + .set("grant_type", "password") + .set("auth_type", "") + ).execute().body(); + Map map = JSON.parseObject(rs, Map.class); + Object access_token = map.get("access_token"); + //Verify that the access_token is empty + if (ObjectUtil.isNull(access_token)) { + msg.setCode("103"); + msg.setMessage("密码不正确"); + return msg; + } + user.setToken("Bearer "+access_token); + //add redis + String token_key = StrUtil.format(RedisKeyEnum.AUTH_TOKEN.getKey(), map.get("jti")); + redisService.set(token_key, user, 60L*60L*18L); + + user.setTokenexpired(60L*60L*18L); + /** 登录成功刷新用户 */ + List<OauthRole> roleByUser = userService.selectRoleByUser(1); + if (null != user.getType()&& user.getType() == 1){ + OauthRole oauthRole = new OauthRole("","超级管理员","super_admin",""); + roleByUser.add(oauthRole); + user.setRoles(roleByUser); + }else { + roleByUser = userService.selectRoleByUser(user.getId().intValue()); + user.setRoles(roleByUser); + } + user.setPassword(null); + msg.setResult(user); + } catch (Exception e) { + e.printStackTrace(); + msg.setCode("102"); + msg.setMessage("登录失败请稍后重试"); + } + return msg; + } + + @PostMapping("/salelogin") + @ApiOperation(value = "销售端登录授权", notes = "登录授权接口,获取token") + public Msg Salelogin(@ApiParam(value = "username,password") @RequestBody JSONObject jsonParam) { + String username = jsonParam.getString("username"); + String password = jsonParam.getString("password"); + + Msg msg = new Msg(); + msg.setCode("200"); + msg.setMessage("success"); + try { + //query user + UserVo user = userService.selectUserVoByName(username); + if (null == user) { + msg.setCode("100"); + msg.setMessage("用户不存在"); + return msg; + } + + if (user.getIssale() == 0) { + msg.setCode("100"); + msg.setMessage("用户不存在"); + return msg; + } + + if (user.getStatus()!=null && user.getStatus() != 1){ + msg.setCode("100"); + msg.setMessage("用户已失效"); + return msg; + } + + if (user.getExpiredate() != null && user.getExpiredate().getTime() < System.currentTimeMillis()){ + msg.setCode("100"); + msg.setMessage("用户已失效"); + return msg; + } + + // 疆外日期判断 + Date now = new Date(); + if (user.getDeadline() != null) { + if (user.getDeadline().before(now)) { + // 当前已经疆外用户已经超期使用 需要缴费 + msg.setCode("166"); + msg.setMessage("疆外用户已过期,请及时联系续期"); + return msg; + } + + } + //Call login interface + String rs = HttpRequest.post( host + "/oauth/token") + .setConnectionTimeout(10000) + .setReadTimeout(10000) + .header("Authorization", "Basic dWFhLXNlcnZpY2U6MTIzNDU2") + .form(Dict.create() + .set("username", username) + .set("password", password) + .set("grant_type", "password") + .set("auth_type", "") + ).execute().body(); + Map map = JSON.parseObject(rs, Map.class); + Object access_token = map.get("access_token"); + //Verify that the access_token is empty + if (ObjectUtil.isNull(access_token)) { + msg.setCode("103"); + msg.setMessage("密码不正确"); + return msg; + } + user.setToken("Bearer "+access_token); + //add redis + String token_key = StrUtil.format(RedisKeyEnum.AUTH_TOKEN.getKey(), map.get("jti")); + redisService.set(token_key, user, 60L*60L*18L); + user.setTokenexpired(60L*60L*18L); + user.setPassword(null); + msg.setResult(user); + } catch (Exception e) { + msg.setCode("102"); + msg.setMessage("登录失败请稍后重试"); + } + return msg; + } + + @GetMapping("/verify") + @ApiOperation(value = "登录验证", notes = "登录验证:flag【true 成功】,【false 失败】", response = Msg.class) + public Msg verifyLogin(@ApiIgnore HttpServletRequest request) { + Msg msg = new Msg(); + msg.setCode("200"); + UserVo userVo = new UserVo(); + String token = request.getHeader(HttpHeaders.AUTHORIZATION); + //解析token + Claims claims = CommonUtil.parseJWT(token); + if (null != claims){ + String tokenKey = StrUtil.format(RedisKeyEnum.AUTH_TOKEN.getKey(), claims.getId()); + Object userInfo = redisService.get(tokenKey); + if (null != userInfo){ + Map map = JSON.parseObject(userInfo.toString(), Map.class); + + userVo = userService.selectUserVoByName(map.get("username").toString()); + if (null == userVo) { + msg.setCode("100"); + msg.setMessage("用户不存在"); + return msg; + } + + if (userVo.getIssale() == 1){ + if (userVo.getStatus()!=null && userVo.getStatus() != 1){ + msg.setCode("100"); + msg.setMessage("用户已失效"); + return msg; + } + + if (userVo.getExpiredate() != null && userVo.getExpiredate().getTime() < System.currentTimeMillis()){ + msg.setCode("100"); + msg.setMessage("用户已失效"); + return msg; + } + + Object loginObj = map.get("logintime"); + Object authObj = map.get("auth"); + if (loginObj != null && authObj != null){ + //通过auth查询授权码最后登录时间 + AuthorizationInfo authInfo = authorizationService.selectByUser(userVo.getCompanynumber(),authObj.toString()); + if (authInfo == null){ + msg.setCode("100"); + msg.setMessage("授权码无效"); + return msg; + } + + if (authInfo.getLasttime().getTime() > Long.parseLong(loginObj.toString())){ + redisService.set(tokenKey, userInfo, 0L); + msg.setCode("100"); + msg.setMessage("登录失效,请重新登录"); + return msg; + } + } + userVo.setAuth(map.get("auth").toString()); + } + else { + /** 登录成功刷新用户 */ + List<OauthRole> roleByUser = userService.selectRoleByUser(1); + if (null != userVo.getType()&& userVo.getType() == 1){ + OauthRole oauthRole = new OauthRole("","超级管理员","super_admin",""); + roleByUser.add(oauthRole); + userVo.setRoles(roleByUser); + }else { + roleByUser = userService.selectRoleByUser(userVo.getId().intValue()); + userVo.setRoles(roleByUser); + } + } + userVo.setToken(map.get("token").toString()); + userVo.setTokenexpired(60L*60L*18L); + userVo.setPassword(null); + //更新登录超时时间 + redisService.set(tokenKey, userInfo, 60L*60L*18L); + }else { + msg.setCode("100"); + msg.setMessage("登录失效,请重新登录"); + return msg; + } + } + msg.setResult(userVo); + return msg; + } + + /** + * logout + * + * @return + */ + @PostMapping("/logout") + @ApiOperation(value = "退出登录", notes = "退出登录接口", produces = "application/json", response = Msg.class) + public Msg logout(@ApiIgnore HttpServletRequest request) { + Msg msg = new Msg(); + msg.setCode("200"); + msg.setMessage("success"); + /** 解析token */ + String header = request.getHeader(HttpHeaders.AUTHORIZATION); + if (header != null && !header.equals("undefined")) { + Claims claims = CommonUtil.parseJWT(header); + Optional.ofNullable(claims).ifPresent(cl -> { + String token_key = "auth:token:" + cl.getId(); + redisService.remove(token_key); + }); + } + return msg; + } + + @PostMapping("/saleauthlogin") + @JsonParams + @ApiOperation(value = "销售端授权码登录授权", notes = "登录授权接口,获取token") + public Msg SaleAuthlogin(@ApiParam(value = "username,password,authcode") @RequestParam String encryptStr) { +// System.out.println("BASE64明文: "+encryptStr); + String jsonStr = new String(Base64.getDecoder().decode(encryptStr), StandardCharsets.UTF_8); +// System.out.println("解密后参数: "+jsonStr); + JSONObject jsonParam = JSON.parseObject(jsonStr); + String username = jsonParam.getString("username"); + String password = jsonParam.getString("password"); + String auth = jsonParam.getString("authcode"); + +// System.out.println("name: "+username+" ,pwd: "+password+" ,auth:"+auth); + + Msg msg = new Msg(); + msg.setCode("200"); + msg.setMessage("success"); + try { + //query user + UserVo user = userService.selectUserVoByName(username); + if (null == user) { + msg.setCode("100"); + msg.setMessage("用户不存在"); + return msg; + } + + if (user.getIssale() == 0) { + msg.setCode("100"); + msg.setMessage("用户不存在"); + return msg; + } + + if (user.getStatus()!=null && user.getStatus() != 1){ + msg.setCode("100"); + msg.setMessage("用户已失效"); + return msg; + } + + if (user.getExpiredate() == null ||(user.getExpiredate() != null && user.getExpiredate().getTime() < System.currentTimeMillis())){ + msg.setCode("100"); + msg.setMessage("用户已失效"); + return msg; + } + + // 疆外日期判断 + Date now = new Date(); + if (user.getDeadline() != null) { + if (user.getDeadline().before(now)) { + // 当前已经疆外用户已经超期使用 需要缴费 + msg.setCode("166"); + msg.setMessage("疆外用户已过期,请及时联系续期"); + return msg; + } + + } + + //验证auth是否存在 + AuthorizationInfo authInfo = authorizationService.selectByUser(user.getCompanynumber(),auth); + if (authInfo == null){ + msg.setCode("100"); + msg.setMessage("授权码无效"); + return msg; + } + + Date logintime = new Date(); + //Call login interface + String rs = HttpRequest.post( host + "/oauth/token") + .setConnectionTimeout(10000) + .setReadTimeout(10000) + .header("Authorization", "Basic dWFhLXNlcnZpY2U6MTIzNDU2") + .form(Dict.create() + .set("username", username) + .set("password", password) + .set("auth", auth) + .set("grant_type", "password") + .set("auth_type", "") + ) + .execute() + .body(); + Map map = JSON.parseObject(rs, Map.class); + Object access_token = map.get("access_token"); + //Verify that the access_token is empty + if (ObjectUtil.isNull(access_token)) { + msg.setCode("103"); + msg.setMessage("密码不正确"); + return msg; + } + user.setToken("Bearer "+access_token); + user.setAuth(auth); + user.setLogintime(logintime.getTime()); + //add redis + String token_key = StrUtil.format(RedisKeyEnum.AUTH_TOKEN.getKey(), map.get("jti")); + redisService.set(token_key, user, 60L*60L*18L); + user.setTokenexpired(60L*60L*18L); + user.setPassword(null); + msg.setResult(user); + + //更新auth最后登录时间 + authInfo.setLasttime(logintime); + authorizationService.updateById(authInfo); + } catch (Exception e) { + msg.setCode("102"); + msg.setMessage("登录失败请稍后重试"); + } + return msg; + } + + +} -- Gitblit v1.9.2