From 59e91a4e9ddaf23cebb12993c774aa899ab22d16 Mon Sep 17 00:00:00 2001
From: 郑永安 <zyazyz250@sina.com>
Date: Mon, 19 Jun 2023 14:22:45 +0800
Subject: [PATCH] 描述
---
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