提交 d90305eb 编写于 作者: xinxu.wang's avatar xinxu.wang

Merge remote-tracking branch 'origin/release' into release

流水线 #38205 已取消 于阶段
package com.pica.cloud.account.account.server.controller; package com.pica.cloud.account.account.server.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.pica.cloud.account.account.server.entity.*;
import com.pica.cloud.account.account.server.entity.AesBean.AesAuthCodeReq; import com.pica.cloud.account.account.server.entity.AesBean.AesAuthCodeReq;
import com.pica.cloud.account.account.server.entity.*;
import com.pica.cloud.account.account.server.enums.AccountExceptionEnum; import com.pica.cloud.account.account.server.enums.AccountExceptionEnum;
import com.pica.cloud.account.account.server.enums.AccountTypeEnum; import com.pica.cloud.account.account.server.enums.AccountTypeEnum;
import com.pica.cloud.account.account.server.enums.SourceTypeEnum; import com.pica.cloud.account.account.server.enums.SourceTypeEnum;
...@@ -19,17 +18,14 @@ import com.pica.cloud.account.account.server.service.TokenService; ...@@ -19,17 +18,14 @@ import com.pica.cloud.account.account.server.service.TokenService;
import com.pica.cloud.account.account.server.util.AccountUtils; import com.pica.cloud.account.account.server.util.AccountUtils;
import com.pica.cloud.account.account.server.util.CryptoUtil; import com.pica.cloud.account.account.server.util.CryptoUtil;
import com.pica.cloud.account.account.server.util.RSAUtil; import com.pica.cloud.account.account.server.util.RSAUtil;
import com.pica.cloud.foundation.encryption.common.constants.EncryptConstants;
import com.pica.cloud.foundation.encryption.util.EncryptUtils;
import com.pica.cloud.foundation.entity.PicaException; import com.pica.cloud.foundation.entity.PicaException;
import com.pica.cloud.foundation.entity.PicaResponse; import com.pica.cloud.foundation.entity.PicaResponse;
import com.pica.cloud.foundation.entity.PicaResultCode; import com.pica.cloud.foundation.entity.PicaResultCode;
import com.pica.cloud.foundation.entity.PicaWarnException; import com.pica.cloud.foundation.entity.PicaWarnException;
import com.pica.cloud.foundation.redis.CacheClient; import com.pica.cloud.foundation.redis.CacheClient;
import com.pica.cloud.foundation.redis.ICacheClient; import com.pica.cloud.foundation.redis.ICacheClient;
import com.pica.cloud.foundation.service.starter.interceptor.EnabledLoginValidate;
import com.pica.cloud.foundation.utils.annotation.LoginPermission; import com.pica.cloud.foundation.utils.annotation.LoginPermission;
import com.pica.cloud.foundation.utils.entity.PicaUser;
import com.pica.cloud.foundation.utils.utils.StringUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.apache.catalina.servlet4preview.http.HttpServletRequest; import org.apache.catalina.servlet4preview.http.HttpServletRequest;
...@@ -38,9 +34,7 @@ import org.slf4j.Logger; ...@@ -38,9 +34,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import springfox.documentation.spring.web.json.Json;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
@Api(description = "登录资源") @Api(description = "登录资源")
...@@ -439,4 +433,13 @@ public class LoginController extends AccountBaseController { ...@@ -439,4 +433,13 @@ public class LoginController extends AccountBaseController {
return PicaResponse.toResponse(login.getToken()); return PicaResponse.toResponse(login.getToken());
} }
@ApiOperation(value = "切换登录")
@PostMapping("/login/switch")
@EnabledLoginValidate
public PicaResponse<String> loginSwitch(@RequestBody EncryptEntity entity) throws Exception {
Map<String, Object> req = CryptoUtil.decrypt(entity, Map.class);
loginService.loginSwitch(super.getAccountUser(), super.getRedisClient().getToken(String.valueOf(req.get("token")), AccountUser.class));
return PicaResponse.toResponse();
}
} }
...@@ -2,13 +2,13 @@ package com.pica.cloud.account.account.server.controller; ...@@ -2,13 +2,13 @@ package com.pica.cloud.account.account.server.controller;
import com.pica.cloud.account.account.server.service.TokenService; import com.pica.cloud.account.account.server.service.TokenService;
import com.pica.cloud.foundation.entity.PicaResponse; import com.pica.cloud.foundation.entity.PicaResponse;
import com.pica.cloud.foundation.utils.entity.PicaAdmin;
import com.pica.cloud.foundation.utils.entity.PicaUser;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestHeader; import springfox.documentation.annotations.ApiIgnore;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map; import java.util.Map;
...@@ -42,6 +42,10 @@ public class TokenController extends AccountBaseController { ...@@ -42,6 +42,10 @@ public class TokenController extends AccountBaseController {
return PicaResponse.toResponse(); return PicaResponse.toResponse();
} }
@ApiIgnore
@GetMapping(value = "/token/remove")
public PicaResponse removeToken(@RequestParam("timestamp") Long timestamp) {
tokenService.removeToken(timestamp);
return PicaResponse.toResponse();
}
} }
...@@ -8,6 +8,7 @@ import com.pica.cloud.account.account.server.model.WechatInfoDto; ...@@ -8,6 +8,7 @@ import com.pica.cloud.account.account.server.model.WechatInfoDto;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
...@@ -122,4 +123,7 @@ public interface DoctorMapper { ...@@ -122,4 +123,7 @@ public interface DoctorMapper {
DoctorUnionResp getDoctorByAcctId(Long acctId); DoctorUnionResp getDoctorByAcctId(Long acctId);
List<Integer> selectIdByParams(@Param("fromId") Integer fromId,
@Param("toId") Integer toId,
@Param("loginTime") Date loginTime);
} }
\ No newline at end of file
package com.pica.cloud.account.account.server.service; package com.pica.cloud.account.account.server.service;
import com.pica.cloud.account.account.server.entity.AccountUser;
import com.pica.cloud.account.account.server.entity.LogLoginAes; import com.pica.cloud.account.account.server.entity.LogLoginAes;
import com.pica.cloud.account.account.server.entity.LoginResult; import com.pica.cloud.account.account.server.entity.LoginResult;
import com.pica.cloud.account.account.server.entity.PICAPDoctor; import com.pica.cloud.account.account.server.entity.PICAPDoctor;
...@@ -11,6 +12,7 @@ import javax.servlet.http.HttpServletRequest; ...@@ -11,6 +12,7 @@ import javax.servlet.http.HttpServletRequest;
import java.util.Map; import java.util.Map;
import com.pica.cloud.account.account.server.req.OneClickLoginReq; import com.pica.cloud.account.account.server.req.OneClickLoginReq;
import com.pica.cloud.account.account.server.vo.OneClickLoginResultVo; import com.pica.cloud.account.account.server.vo.OneClickLoginResultVo;
import com.pica.cloud.foundation.utils.entity.PicaUser;
public interface LoginService { public interface LoginService {
/** /**
...@@ -101,4 +103,6 @@ public interface LoginService { ...@@ -101,4 +103,6 @@ public interface LoginService {
LoginResult loginQRCode(BaseRequest request); LoginResult loginQRCode(BaseRequest request);
void loginSwitch(AccountUser oldUser, AccountUser loginUser);
} }
...@@ -13,4 +13,6 @@ public interface TokenService { ...@@ -13,4 +13,6 @@ public interface TokenService {
void tokenContinueTime(String token, Integer sourceType, Integer seconds); void tokenContinueTime(String token, Integer sourceType, Integer seconds);
/** 删除token */
void removeToken(Long timestamp);
} }
...@@ -12,6 +12,7 @@ import com.pica.cloud.account.account.server.entity.*; ...@@ -12,6 +12,7 @@ import com.pica.cloud.account.account.server.entity.*;
import com.pica.cloud.account.account.server.enums.AccountExceptionEnum; import com.pica.cloud.account.account.server.enums.AccountExceptionEnum;
import com.pica.cloud.account.account.server.enums.AccountTypeEnum; import com.pica.cloud.account.account.server.enums.AccountTypeEnum;
import com.pica.cloud.account.account.server.enums.SourceTypeEnum; import com.pica.cloud.account.account.server.enums.SourceTypeEnum;
import com.pica.cloud.account.account.server.exception.AccountException;
import com.pica.cloud.account.account.server.log.AccountLogEntityUtils; import com.pica.cloud.account.account.server.log.AccountLogEntityUtils;
import com.pica.cloud.account.account.server.log.AccountLogUtils; import com.pica.cloud.account.account.server.log.AccountLogUtils;
import com.pica.cloud.account.account.server.mapper.*; import com.pica.cloud.account.account.server.mapper.*;
...@@ -29,6 +30,7 @@ import com.pica.cloud.foundation.entity.PicaException; ...@@ -29,6 +30,7 @@ import com.pica.cloud.foundation.entity.PicaException;
import com.pica.cloud.foundation.entity.PicaResultCode; import com.pica.cloud.foundation.entity.PicaResultCode;
import com.pica.cloud.foundation.entity.PicaWarnException; import com.pica.cloud.foundation.entity.PicaWarnException;
import com.pica.cloud.foundation.redis.ICacheClient; import com.pica.cloud.foundation.redis.ICacheClient;
import com.pica.cloud.foundation.utils.entity.PicaUser;
import com.pica.cloud.foundation.utils.utils.StringUtil; import com.pica.cloud.foundation.utils.utils.StringUtil;
import com.pica.cloud.foundation.utils.utils.ValidateUtils; import com.pica.cloud.foundation.utils.utils.ValidateUtils;
import com.pica.cloud.patient.smartcontract.common.utils.HttpClientCloudUtils; import com.pica.cloud.patient.smartcontract.common.utils.HttpClientCloudUtils;
...@@ -47,6 +49,7 @@ import java.security.PublicKey; ...@@ -47,6 +49,7 @@ import java.security.PublicKey;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Objects;
@Service @Service
public class LoginServiceImpl implements LoginService { public class LoginServiceImpl implements LoginService {
...@@ -1083,4 +1086,23 @@ public class LoginServiceImpl implements LoginService { ...@@ -1083,4 +1086,23 @@ public class LoginServiceImpl implements LoginService {
return logLoginAesMapper.insert(aes); return logLoginAesMapper.insert(aes);
} }
/**
*切换登录
*/
@Override
public void loginSwitch(AccountUser oldUser, AccountUser loginUser) {
if (Objects.isNull(loginUser)) {
throw new PicaException(PicaResultCode.LOGIN_FAILE);
}
tokenUtils.tokenContinueTime(loginUser.getToken(), oldUser.getLoginFrom(), 0);
//记录登录日志
LogLoginEntity entity = AccountLogEntityUtils.getLogLoginEntity(
Integer.valueOf(String.valueOf(loginUser.getAcctId())),
oldUser.getLoginPlatform(), oldUser.getLoginFrom(),
AccountTypeEnum.LOGIN_WE_CHAT.getCode(),
oldUser.getLoginIp(),
AccountTypeEnum.LOGIN_STATUS_SUCCESS.getCode(),
AccountTypeEnum.LOG_TYPE_LOGIN.getCode(), loginUser.getToken(), 1, oldUser.getUserTokenTourist());
picaLogUtils.info(entity);
}
} }
package com.pica.cloud.account.account.server.service.impl; package com.pica.cloud.account.account.server.service.impl;
import com.pica.cloud.account.account.server.constants.Constants; import com.pica.cloud.account.account.server.constants.Constants;
import com.pica.cloud.account.account.server.mapper.DoctorMapper;
import com.pica.cloud.account.account.server.service.TokenService; import com.pica.cloud.account.account.server.service.TokenService;
import com.pica.cloud.account.account.server.util.TokenUtils; import com.pica.cloud.account.account.server.util.TokenUtils;
import com.pica.cloud.foundation.redis.ICacheClient; import com.pica.cloud.foundation.redis.ICacheClient;
import com.pica.cloud.foundation.utils.entity.PicaUser; import com.pica.cloud.foundation.utils.entity.PicaUser;
import com.pica.cloud.foundation.utils.utils.CommonUtil; import com.pica.cloud.foundation.utils.utils.CommonUtil;
import com.pica.cloud.foundation.utils.utils.date.D;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -16,6 +18,7 @@ import org.springframework.util.CollectionUtils; ...@@ -16,6 +18,7 @@ import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.util.Date; import java.util.Date;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
...@@ -40,6 +43,9 @@ public class TokenServiceImpl implements TokenService { ...@@ -40,6 +43,9 @@ public class TokenServiceImpl implements TokenService {
@Qualifier("accountThreadPool") @Qualifier("accountThreadPool")
private ThreadPoolTaskExecutor threadPoolTaskExecutor; private ThreadPoolTaskExecutor threadPoolTaskExecutor;
@Autowired
private DoctorMapper doctorMapper;
@Override @Override
public String getToken(Map<String, Object> headersMap) { public String getToken(Map<String, Object> headersMap) {
String mobile = new StringBuilder("9").append(CommonUtil.getRandom(10)).toString(); String mobile = new StringBuilder("9").append(CommonUtil.getRandom(10)).toString();
...@@ -90,4 +96,40 @@ public class TokenServiceImpl implements TokenService { ...@@ -90,4 +96,40 @@ public class TokenServiceImpl implements TokenService {
return; return;
} }
@Override
public void removeToken(Long timestamp) {
//new Thread(() -> {
try {
Date lastLoginTime = new Date(timestamp);
for (Integer fromDoctorId = 0; fromDoctorId < 1000412091; fromDoctorId += 10000) {
logger.info("start remove token: {}", fromDoctorId);
List<Integer> doctorIdList = doctorMapper.selectIdByParams(fromDoctorId, fromDoctorId + 10000, lastLoginTime);
if (CollectionUtils.isEmpty(doctorIdList)) {
Thread.sleep(2000);
continue;
}
removeTokenByDoctorIdList(doctorIdList);
logger.info("remove token done: {} {}", fromDoctorId, doctorIdList.size());
}
} catch (Exception ex) {
// ingnore
}
//});
}
private void removeTokenByDoctorIdList(List<Integer> doctorIdList) throws Exception {
for (Integer doctorId : doctorIdList) {
String key1 = String.format("token-doctor-%d-app", doctorId);
String key2 = String.format("token-doctor-%d", doctorId);
String key3 = redisClient.get(key1);
redisClient.del(key1);
redisClient.del(key2);
if (!StringUtils.isEmpty(key3)) {
redisClient.del(key3);
}
Thread.sleep(10);
}
}
} }
...@@ -1093,4 +1093,10 @@ ...@@ -1093,4 +1093,10 @@
where d.acct_id = #{acctId} and d.delete_flag = 1 where d.acct_id = #{acctId} and d.delete_flag = 1
</select> </select>
<select id="selectIdByParams" parameterType="java.util.Map" resultType="java.lang.Integer">
select id from p_doctor
where id &gt;= #{fromId}
and id &lt;= #{toId}
and last_login_time &lt;= #{loginTime}
</select>
</mapper> </mapper>
\ No newline at end of file
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册