增加单点登录

dongdingding
杜函宇 11 months ago
parent c9c2fabf19
commit 5ad8e86d52

@ -49,6 +49,7 @@ public class BmsTemplateRecordServiceImpl extends ServiceImpl<BmsTemplateRecordM
@Autowired @Autowired
private IBmsEnterpriseBasicInfoService iBmsEnterpriseBasicInfoService; private IBmsEnterpriseBasicInfoService iBmsEnterpriseBasicInfoService;
private IBmsDeclarationRecordsService bmsDeclarationRecordsService;
@Autowired @Autowired
private IBmsDeclarationRecordsService iBmsDeclarationRecordsService; private IBmsDeclarationRecordsService iBmsDeclarationRecordsService;
@ -190,21 +191,48 @@ public class BmsTemplateRecordServiceImpl extends ServiceImpl<BmsTemplateRecordM
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public int updateBmsTemplateRecord(BmsTemplateRecordUpdateDto bmsTemplateRecordUpdateDto) { public int updateBmsTemplateRecord(BmsTemplateRecordUpdateDto bmsTemplateRecordUpdateDto) {
QueryWrapper<BmsTemplateRecord> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("enterprise_directory", bmsTemplateRecordUpdateDto.getEnterpriseDirectory());
List<BmsTemplateRecord> isFlag = baseMapper.selectList(queryWrapper);
if(!isFlag.isEmpty()){
throw new ServiceException("该申报任务标题已经存在");
}
tiTimeChange.getTime(bmsTemplateRecordUpdateDto); tiTimeChange.getTime(bmsTemplateRecordUpdateDto);
int num = baseMapper.updateById(bmsTemplateRecordUpdateDto); int num = baseMapper.updateById(bmsTemplateRecordUpdateDto);
// 删除企业相关列表 // 删除企业相关列表
QueryWrapper<BmsEnterpriseDirectory> queryWrapper = new QueryWrapper<>(); QueryWrapper<BmsEnterpriseDirectory> queryWrapper1 = new QueryWrapper<>();
queryWrapper.eq("template_record_id", bmsTemplateRecordUpdateDto.getId()); queryWrapper.eq("template_record_id", bmsTemplateRecordUpdateDto.getId());
enterpriseDirectoryService.remove(queryWrapper); enterpriseDirectoryService.remove(queryWrapper1);
// 新增企业相关列表 QueryWrapper<BmsDeclarationRecords> queryWrapper2 = new QueryWrapper<>();
queryWrapper.eq("template_record_id", bmsTemplateRecordUpdateDto.getId());
bmsDeclarationRecordsService.remove(queryWrapper2);
//前端excel企业名录集合
List<BmsEnterpriseDirectory> enterpriseDirectoryList = bmsTemplateRecordUpdateDto List<BmsEnterpriseDirectory> enterpriseDirectoryList = bmsTemplateRecordUpdateDto
.getEnterpriseDirectoryList(); .getEnterpriseDirectoryList();
//要添加的在线申报记录
List<BmsDeclarationRecords> drlist = new ArrayList<>();
//如果前端部分企业名录集合为空
if (null != enterpriseDirectoryList && enterpriseDirectoryList.size() > 0) { if (null != enterpriseDirectoryList && enterpriseDirectoryList.size() > 0) {
enterpriseDirectoryList.forEach(x -> { enterpriseDirectoryList.forEach(x -> {
getDeclarationRecordsList(bmsTemplateRecordUpdateDto, drlist, x.getCreditCode(), bmsTemplateRecordUpdateDto.getTemplateId());
x.setTemplateRecordId(bmsTemplateRecordUpdateDto.getId()); x.setTemplateRecordId(bmsTemplateRecordUpdateDto.getId());
}); });
enterpriseDirectoryService.saveOrUpdateBatch(enterpriseDirectoryList); enterpriseDirectoryService.saveBatch(enterpriseDirectoryList);
} else {
List<BmsEnterpriseBasicInfo> list = iBmsEnterpriseBasicInfoService.list();
List<BmsEnterpriseDirectory> copyList = new ArrayList<>();
for (BmsEnterpriseBasicInfo items : list) {
BmsEnterpriseDirectory bms = new BmsEnterpriseDirectory();
bms.setTemplateRecordId(bmsTemplateRecordUpdateDto.getId());
bms.setEnterpriseName(items.getEnterpriseName());
bms.setCreditCode(items.getCreditCode());
copyList.add(bms);
getDeclarationRecordsList(bmsTemplateRecordUpdateDto, drlist, items.getCreditCode(), bmsTemplateRecordUpdateDto.getTemplateId());
}
enterpriseDirectoryService.saveBatch(copyList);
} }
iBmsDeclarationRecordsService.saveBatch(drlist);
return num; return num;
} }

@ -5,27 +5,29 @@ package com.ruoyi.jjh.declaration.single.controller;
* @since 2024/5/22 15:50 * @since 2024/5/22 15:50
*/ */
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil; import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.domain.model.RegisterBody;
import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.exception.user.UserPasswordNotMatchException; import com.ruoyi.common.exception.user.UserPasswordNotMatchException;
import com.ruoyi.common.utils.MessageUtils; import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.manager.AsyncManager; import com.ruoyi.framework.manager.AsyncManager;
import com.ruoyi.framework.manager.factory.AsyncFactory; import com.ruoyi.framework.manager.factory.AsyncFactory;
import com.ruoyi.framework.security.context.AuthenticationContextHolder; import com.ruoyi.framework.security.context.AuthenticationContextHolder;
import com.ruoyi.framework.web.service.SysRegisterService;
import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.jjh.declaration.entity.BmsEnterpriseBasicInfo;
import com.ruoyi.jjh.declaration.mapper.BmsEnterpriseBasicInfoMapper;
import com.ruoyi.jjh.declaration.single.dto.reqponse.UserMainResponse; import com.ruoyi.jjh.declaration.single.dto.reqponse.UserMainResponse;
import com.ruoyi.jjh.declaration.single.dto.reqponse.UserResponse; import com.ruoyi.jjh.declaration.single.dto.reqponse.UserResponse;
import com.ruoyi.system.service.ISysUserService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -45,6 +47,7 @@ import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.Base64; import java.util.Base64;
import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
/** /**
@ -62,6 +65,13 @@ public class SingleLoginController {
@Value("${infoUrl}") @Value("${infoUrl}")
private String infoUrl; private String infoUrl;
@Value("${logoutUrl}")
private String logoutUrl;
@Value("${returnUrl}")
private String returnUrl;
@Resource @Resource
private RedisCache redisCache; private RedisCache redisCache;
@ -72,9 +82,13 @@ public class SingleLoginController {
@Resource @Resource
private TokenService tokenService; private TokenService tokenService;
@Resource
private BmsEnterpriseBasicInfoMapper bmsEnterpriseBasicInfoMapper;
@Resource @Resource
private SysRegisterService sysRegisterService; private ISysUserService userService;
/** /**
* *
* *
@ -83,13 +97,12 @@ public class SingleLoginController {
@ApiOperation("统一登陆") @ApiOperation("统一登陆")
@GetMapping("/login") @GetMapping("/login")
public void login(HttpServletResponse response) throws IOException { public void login(HttpServletResponse response) throws IOException {
String clientUrl = "http://192.168.0.111:80/system/singlelogin/getInfo";
//变成参数模式,appid 用于校验提交的来源地址,生产环境会校验,试用环境暂不校验 //变成参数模式,appid 用于校验提交的来源地址,生产环境会校验,试用环境暂不校验
String scUrl = "clientUrl=" + URLEncoder.encode(clientUrl, "UTF-8") + "&appid=b40b40e3-f188-4e00-b67a6ec5701ce02b"; String scUrl = "clientUrl=" + URLEncoder.encode(returnUrl, "UTF-8") + "?appid=b40b40e3-f188-4e00-b67a6ec5701ce02b";
//加密后的客户端地址 //加密后的客户端地址
scUrl = Base64.getEncoder().encodeToString(scUrl.getBytes()); scUrl = Base64.getEncoder().encodeToString(scUrl.getBytes());
//最终跳转地址 //最终跳转地址
String jumpurl = url + "&scUrl=" + URLEncoder.encode(scUrl, "UTF-8"); String jumpurl = url + "?scUrl=" + URLEncoder.encode(scUrl, "UTF-8");
// 添加请求头 // 添加请求头
response.setHeader("Content-Type", "application/json"); response.setHeader("Content-Type", "application/json");
response.setHeader("X-Requested-With", "XMLHttpRequest"); response.setHeader("X-Requested-With", "XMLHttpRequest");
@ -116,54 +129,104 @@ public class SingleLoginController {
responseBody = response.body(); responseBody = response.body();
JSONObject jsonObj = JSONUtil.parseObj(responseBody); JSONObject jsonObj = JSONUtil.parseObj(responseBody);
JSONObject dataObj = jsonObj.getJSONObject("data"); JSONObject dataObj = jsonObj.getJSONObject("data");
JSONObject mainobj = dataObj.getJSONObject("mainbody");
UserResponse res = JSONUtil.toBean(dataObj, UserResponse.class);
UserMainResponse req = JSONUtil.toBean(mainobj, UserMainResponse.class);
// 将用户信息存储到Redis中
String key = "user:" + clientToken;
// 设置过期时间(可选) // 设置过期时间(可选)
int expirationSeconds = 24 * 60; int expirationSeconds = 24 * 60;
// 设置过期时间为8小时 // 将用户信息存储到Redis中
redisCache.setCacheObject(key, res, expirationSeconds, TimeUnit.MINUTES); String key = "user:" + clientToken;
String token = singleLogin(res.getUserid()); //判断是法人用户
res.setToken(token); if("ep".equals(dataObj.get("usertype"))){
res.setMain(req); JSONObject mainobj = dataObj.getJSONObject("mainbody");
return AjaxResult.success(res); UserResponse res = JSONUtil.toBean(dataObj, UserResponse.class);
UserMainResponse req = JSONUtil.toBean(mainobj, UserMainResponse.class);
//存储到企业信息库
QueryWrapper<BmsEnterpriseBasicInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("credit_code", req.getUscc());
BmsEnterpriseBasicInfo bmsEnterpriseBasicInfo = bmsEnterpriseBasicInfoMapper.selectOne(queryWrapper);
BmsEnterpriseBasicInfo bms = new BmsEnterpriseBasicInfo();
Long id;
if (bmsEnterpriseBasicInfo == null) {
bms.setCreditCode(req.getUscc());
bms.setEnterpriseName(req.getEpname());
bms.setIsDeleted(0L);
bmsEnterpriseBasicInfoMapper.insert(bms);
id = bms.getId();
}else {
id = bmsEnterpriseBasicInfo.getId();
}
// 设置过期时间为8小时
String token = singleLogin(req.getUscc(),req.getEpname(),id);
res.setToken(token);
res.setMain(req);
redisCache.setCacheObject(key, res, expirationSeconds, TimeUnit.MINUTES);
return AjaxResult.success(res);
}else {
log.error(response.body());
throw new ServiceException("未知异常请联系管理员");
}
} else { } else {
log.error(response.body()); log.error(response.body());
throw new ServiceException("未知异常请联系管理员"); throw new ServiceException("未知异常请联系管理员");
} }
}
}
private String singleLogin(String userId) { @ApiOperation(value = "退出登录")
@GetMapping("/enterpriseLogout")
public AjaxResult enterpriseLogout(@RequestParam("clienttoken") String clienttoken) {
String url = logoutUrl + "?clienttoken=" + clienttoken;
HttpResponse execute = HttpUtil.createGet(url).execute();
String str;
// 获取响应状态码
int statusCode = execute.getStatus();
if(statusCode==200){
str = "退出成功";
}else {
str = "退出失败";
}
return AjaxResult.success(str);
}
private String singleLogin(String userName,String nickName,Long id) {
// 用户验证 // 用户验证
Authentication authentication; Authentication authentication;
try { try {
RegisterBody registerBody=new RegisterBody(); SysUser user = new SysUser();
registerBody.setValue(String.valueOf(1)); user.setUserName(userName);
registerBody.setUsername(userId); user.setNickName(nickName);
registerBody.setPassword("admin123"); user.setPassword("admin123");
sysRegisterService.register(registerBody); Long[] roles = new Long[1];
roles[0]=101L;
user.setRoleIds(roles);
user.setStatus("0");
user.setUserType("01");
user.setEnterpriseId(id);
//如果用户名也就是信用代码没有重复的就新增用户
if (userService.checkUserNameUnique(user))
{
user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
userService.insertUser(user);
}
//新增user账号密码 //新增user账号密码
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userId, "admin123"); UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userName, "admin123");
AuthenticationContextHolder.setContext(authenticationToken); AuthenticationContextHolder.setContext(authenticationToken);
// 该方法会去调用UserDetailsServiceImpl.loadUserByUsername // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
authentication = authenticationManager.authenticate(authenticationToken); authentication = authenticationManager.authenticate(authenticationToken);
} catch (Exception e) { } catch (Exception e) {
if (e instanceof BadCredentialsException) { if (e instanceof BadCredentialsException) {
AsyncManager.me().execute(AsyncFactory.recordLogininfor(userId, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
throw new UserPasswordNotMatchException(); throw new UserPasswordNotMatchException();
} else { } else {
AsyncManager.me().execute(AsyncFactory.recordLogininfor(userId, Constants.LOGIN_FAIL, e.getMessage())); AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGIN_FAIL, e.getMessage()));
throw new ServiceException(e.getMessage()); throw new ServiceException(e.getMessage());
} }
} finally { } finally {
AuthenticationContextHolder.clearContext(); AuthenticationContextHolder.clearContext();
} }
AsyncManager.me().execute(AsyncFactory.recordLogininfor(userId, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
LoginUser loginUser = (LoginUser) authentication.getPrincipal(); LoginUser loginUser = (LoginUser) authentication.getPrincipal();
// 生成token // 生成token
return tokenService.createToken(loginUser); Map<String, Object> token = tokenService.createToken(loginUser);
return String.valueOf(token.get("access_token"));
} }
} }

@ -9,7 +9,7 @@ import lombok.Data;
* @since 2024/5/27 14:37 * @since 2024/5/27 14:37
*/ */
@Data @Data
@ApiModel("企业机构代码") @ApiModel("法人用户机构代码")
public class UserMainResponse { public class UserMainResponse {
/** /**

@ -12,7 +12,7 @@ import java.io.Serializable;
* @author dong * @author dong
* @since 2024/5/27 10:55 * @since 2024/5/27 10:55
*/ */
@ApiModel(value = "单点登录用户信息响应类") @ApiModel(value = "法人用户")
@Data @Data
public class UserResponse implements Serializable { public class UserResponse implements Serializable {
private static final long serialVersionUID = -5117946174934452302L; private static final long serialVersionUID = -5117946174934452302L;

@ -61,3 +61,5 @@ spring:
wall: wall:
config: config:
multi-statement-allow: true multi-statement-allow: true
#自己客户端地址
returnUrl: http://39.101.188.84:9999/demo/JinJiHu/#/login

@ -130,3 +130,7 @@ xss:
url: https://qytt.sipac.gov.cn/api/usercenter/User/ssoLogin url: https://qytt.sipac.gov.cn/api/usercenter/User/ssoLogin
#用户信息url #用户信息url
infoUrl: https://qytt.sipac.gov.cn/api/usercenter/User/getInfo infoUrl: https://qytt.sipac.gov.cn/api/usercenter/User/getInfo
#退出登录url
logoutUrl: https://qytt.sipac.gov.cn/api/usercenter/User/ssoLogOut

Loading…
Cancel
Save