提交 100e2d13 作者: 王峰

研究中心单点登录克虏宝

上级 a626c865
...@@ -16,6 +16,7 @@ public class WebMvcConfig implements WebMvcConfigurer { ...@@ -16,6 +16,7 @@ public class WebMvcConfig implements WebMvcConfigurer {
@Override @Override
public void addInterceptors(InterceptorRegistry registry) { public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(userInfoInterceptor()).addPathPatterns("/**").excludePathPatterns("/third/api/saveEvent"); registry.addInterceptor(userInfoInterceptor()).addPathPatterns("/**").excludePathPatterns("/third/api/saveEvent")
.excludePathPatterns("/loginBS");
} }
} }
package com.zzsn.event.controller;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson2.JSONObject;
import com.zzsn.event.constant.Constants;
import com.zzsn.event.constant.Result;
import com.zzsn.event.entity.SysLoginModel;
import com.zzsn.event.service.EventLoginService;
import com.zzsn.event.util.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
/**
* 研究中心嵌入的事件分析需要登录,这里是登录接口
* @author wangFeng
* @date 2024/10/22 11:59
*/
@RestController
public class EventLoginController {
@Resource
private EventLoginService eventLoginService;
/**
* 事件分析登录接口
* @param sysLoginModel
*/
@PostMapping("/loginBS")
public Result<?> loginBS(@RequestBody SysLoginModel sysLoginModel) {
return eventLoginService.loginBS(sysLoginModel);
}
}
package com.zzsn.event.entity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
/**
* 登录表单
*
* @Author scott
* @since 2019-01-18
*/
@ApiModel(value="登录对象", description="登录对象")
public class SysLoginModel {
@ApiModelProperty(value = "账号")
private String username;
@ApiModelProperty(value = "密码")
private String password;
@ApiModelProperty(value = "验证码")
private String captcha;
@ApiModelProperty(value = "验证码key")
private String checkKey;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getCaptcha() {
return captcha;
}
public void setCaptcha(String captcha) {
this.captcha = captcha;
}
public String getCheckKey() {
return checkKey;
}
public void setCheckKey(String checkKey) {
this.checkKey = checkKey;
}
}
\ No newline at end of file
package com.zzsn.event.service;
import com.zzsn.event.constant.Result;
import com.zzsn.event.entity.SysLoginModel;
/**
* @author wangFeng
* @date 2024/10/22 14:29
*/
public interface EventLoginService {
/**
* 登录接口
* @param sysLoginModel
* @return
*/
Result<?> loginBS(SysLoginModel sysLoginModel);
/**
* 重新登录
*/
void redoLogin();
}
package com.zzsn.event.service.impl;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson2.JSONObject;
import com.zzsn.event.constant.Result;
import com.zzsn.event.entity.SysLoginModel;
import com.zzsn.event.service.EventLoginService;
import com.zzsn.event.util.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* @author wangFeng
* @date 2024/10/22 14:29
*/
@Service
public class EventLoginServiceImpl implements EventLoginService {
@Value("${spring.profiles.active:dev}")
private String evn;
@Value("${clbLogin.url}")
private String loginUrl;
@Resource
private RedisUtil redisUtil;
private Integer successCode = 200;
public static final String CACHE_KEY = "event:sso:";
@Override
public Result<?> loginBS(SysLoginModel sysLoginModel) {
String username = sysLoginModel.getUsername();
String cacheKey = CACHE_KEY + evn + ":" +username;
if (redisUtil.hasKey(cacheKey)) {
Map<String, Object> cacheMap = (Map<String, Object>) redisUtil.get(cacheKey);
SysLoginModel sysLoginModelCache = (SysLoginModel) cacheMap.get("sysLoginModel");
if (sysLoginModelCache.getPassword().equals(sysLoginModel.getPassword())
&& sysLoginModelCache.getCaptcha().equals(sysLoginModel.getCaptcha())
&& sysLoginModelCache.getCheckKey().equals(sysLoginModel.getCheckKey())) {
// 使用缓存
Result loginResult = (Result) cacheMap.get("loginResult");
return loginResult;
}
//信息变了就需要重新登录
redisUtil.del(cacheKey);
}
return doClbLogin(sysLoginModel);
}
@Override
public void redoLogin() {
String cacheKey = CACHE_KEY + evn + ":*";
ScanOptions options = ScanOptions.scanOptions().match(cacheKey).count(100).build();
Cursor<String> scan = redisUtil.getRedisTemplate().scan(options);
while (scan.hasNext()){
String next = scan.next();
Map<String, Object> cacheMap = (Map<String, Object>) redisUtil.get(next);
SysLoginModel sysLoginModelCache = (SysLoginModel) cacheMap.get("sysLoginModel");
doClbLogin(sysLoginModelCache);
}
}
/**
* 去克虏宝登录
* @param sysLoginModel
*/
public Result<?> doClbLogin(SysLoginModel sysLoginModel){
Result<?> bean;
try {
String body = HttpRequest.post(loginUrl)
.header("content-type", "application/json;charset=UTF-8")
.body(JSONObject.toJSONString(sysLoginModel))
.execute().body();
bean = JSONObject.parseObject(body, Result.class);
if (successCode.equals(bean.getCode())) {
String username = sysLoginModel.getUsername();
String cacheKey = CACHE_KEY + evn + ":" + username;
// 调用成功
Map<String, Object> cacheMap = new HashMap<>(2);
cacheMap.put("sysLoginModel", sysLoginModel);
cacheMap.put("loginResult", bean);
redisUtil.set(cacheKey, cacheMap, 60 * 15);
}
} catch (Exception e) {
bean = Result.FAIL();
}
return bean;
}
}
package com.zzsn.event.task;
import com.zzsn.event.controller.EventLoginController;
import com.zzsn.event.service.EventLoginService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 研究中心登录用户,重新登录
* @author wangFeng
* @date 2024/10/22 14:24
*/
@Slf4j
@Component
public class RefreshLoginTask {
@Resource
private EventLoginService eventLoginService;
@Scheduled(cron = "0 0/2 * * * ?")
public void redoLogin() {
log.info("研究中心事件用户重新登录");
eventLoginService.redoLogin();
}
}
...@@ -550,4 +550,7 @@ public class RedisUtil { ...@@ -550,4 +550,7 @@ public class RedisUtil {
} }
public RedisTemplate<String, Object> getRedisTemplate() {
return redisTemplate;
}
} }
...@@ -128,6 +128,8 @@ serviceProject: ...@@ -128,6 +128,8 @@ serviceProject:
url: https://clb.ciglobal.cn/clb-api/datapull/ url: https://clb.ciglobal.cn/clb-api/datapull/
checkToken: checkToken:
url: http://114.116.39.74:9988/sys/checkToken url: http://114.116.39.74:9988/sys/checkToken
clbLogin:
url: http://114.116.39.74:9988/sys/loginBS
clb: clb:
eventAdd: http://1.95.72.34:1688/event/third/api/saveEvent eventAdd: http://1.95.72.34:1688/event/third/api/saveEvent
scoreRule: scoreRule:
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论