From fea8e0742ee241a94c5bbd4f452d6ad82cf4dd9c Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期五, 06 二月 2026 10:58:26 +0800
Subject: [PATCH] 功能开发
---
server/services/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 101 insertions(+), 2 deletions(-)
diff --git a/server/services/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java b/server/services/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java
index 8f1b81f..6837899 100644
--- a/server/services/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java
@@ -1,14 +1,26 @@
package com.doumee.service.system.impl;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.dingtalk.api.response.OapiV2UserGetuserinfoResponse;
+import com.doumee.config.shiro.ShiroToken;
+import com.doumee.core.constants.Constants;
+import com.doumee.core.dingTalk.DingTalk;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.utils.Utils;
+import com.doumee.dao.system.SystemUserMapper;
+import com.doumee.dao.system.dto.DingLoginDTO;
+import com.doumee.dao.system.dto.DingTalkLoginDTO;
import com.doumee.dao.system.dto.LoginDTO;
import com.doumee.dao.system.model.SystemLoginLog;
+import com.doumee.dao.system.model.SystemUser;
import com.doumee.service.common.CaptchaService;
import com.doumee.service.system.SystemLoginLogService;
import com.doumee.service.system.SystemLoginService;
+import com.taobao.api.ApiException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
@@ -21,6 +33,9 @@
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
@Slf4j
@Service
@@ -40,8 +55,16 @@
@Autowired
private SystemLoginLogService systemLoginLogService;
+ @Autowired
+ private DingTalk dingTalk ;
+
+ @Autowired
+ private SystemUserMapper systemUserMapper;
+
+
@Override
public String loginByPassword(LoginDTO dto, HttpServletRequest request) {
+ log.error("鐧诲綍鍏ュ弬锛�"+ JSONObject.toJSONString(dto));
SystemLoginLog loginLog = new SystemLoginLog();
loginLog.setLoginUsername(dto.getUsername());
loginLog.setLoginTime(new Date());
@@ -52,7 +75,7 @@
loginLog.setClientInfo(Utils.User_Client.getBrowser(request));
loginLog.setOsInfo(Utils.User_Client.getOS(request));
loginLog.setServerIp(Utils.Server.getIP());
- if(StringUtils.equals(projectEnv,"development")){
+ if(!StringUtils.equals(projectEnv,"development")){
// 鏍¢獙楠岃瘉鐮�
try {
captchaService.check(dto.getUuid(), dto.getCode());
@@ -66,7 +89,81 @@
}
// 鏍¢獙鐢ㄦ埛鍚嶅拰瀵嗙爜
Subject subject = SecurityUtils.getSubject();
- UsernamePasswordToken token = new UsernamePasswordToken(dto.getUsername(), dto.getPassword());
+ ShiroToken token = new ShiroToken(null,dto.getUsername(), dto.getPassword(),false);
+ try {
+ subject.login(token);
+ loginLog.setUserId(((LoginUserInfo)subject.getPrincipal()).getId());
+ loginLog.setSuccess(Boolean.TRUE);
+ systemLoginLogService.create(loginLog);
+ if(StringUtils.isNotBlank(dto.getUnionId())){
+ //鏇存柊鐢ㄦ埛鐨剈nionID
+ this.dealDDUnionIdBiz(loginLog.getUserId(), dto.getUnionId());
+ }
+ return (String)subject.getSession().getId();
+ } catch (AuthenticationException e) {
+ log.error(ResponseStatus.ACCOUNT_INCORRECT.getMessage(), e);
+ loginLog.setReason(e.getMessage().length() > 200 ? (e.getMessage().substring(0, 190) + "...") : e.getMessage());
+ loginLog.setSuccess(Boolean.FALSE);
+ systemLoginLogService.create(loginLog);
+ throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
+ }
+ }
+
+
+ private void dealDDUnionIdBiz(Integer userId, String ddUnionId) {
+ if(StringUtils.isNotBlank(ddUnionId)){
+ //濡傛灉openId涓嶄负绌�,缁戝畾璇ョ敤鎴穙penid
+ systemUserMapper.update(null,new UpdateWrapper<SystemUser>().lambda()
+ .set(SystemUser::getUnionId,null)
+ .eq(SystemUser::getUnionId,ddUnionId)
+ );
+ systemUserMapper.update(null,new UpdateWrapper<SystemUser>().lambda()
+ .set(SystemUser::getUnionId,ddUnionId)
+ .eq(SystemUser::getId,userId));
+ }
+ }
+
+
+ @Override
+ public Map<String,Object> loginByDingTalk(DingLoginDTO dingLoginDTO, HttpServletRequest request) throws ApiException {
+ log.error("鎺堟潈閽夐拤鐧诲綍鍏ュ弬锛�"+ JSONObject.toJSONString(dingLoginDTO));
+ Map<String,Object> map = new HashMap<>();
+ OapiV2UserGetuserinfoResponse.UserGetByCodeResponse response = dingTalk.getDDUserByCode(dingLoginDTO);
+ if(Objects.nonNull(response)){
+ String unionId = response.getUnionid();
+ map.put("unionId",unionId);
+ map.put("loginStatus",false);
+ SystemUser systemUser = systemUserMapper.selectOne(new QueryWrapper<SystemUser>().lambda().eq(SystemUser::getUnionId,unionId)
+ .last("limit 1")
+ );
+ if(Objects.nonNull(systemUser)&&!systemUser.getDeleted()){
+ loginByDingTalkCode(systemUser,unionId,request);
+ map.put("loginStatus",true);
+ }
+ }
+ log.error("鎺堟潈閽夐拤鐧诲綍鍑哄弬锛�"+ JSONObject.toJSONString(map));
+ return map;
+ }
+
+
+
+
+
+ public String loginByDingTalkCode(SystemUser systemUser,String unionId, HttpServletRequest request) {
+ SystemLoginLog loginLog = new SystemLoginLog();
+ loginLog.setLoginUsername(systemUser.getUsername());
+ loginLog.setLoginTime(new Date());
+ loginLog.setSystemVersion(systemVersion);
+ loginLog.setIp(Utils.User_Client.getIP(request));
+// loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp()));
+ loginLog.setPlatform(Utils.User_Client.getPlatform(request));
+ loginLog.setClientInfo(Utils.User_Client.getBrowser(request));
+ loginLog.setOsInfo(Utils.User_Client.getOS(request));
+ loginLog.setServerIp(Utils.Server.getIP());
+
+ // 鏍¢獙鐢ㄦ埛鍚嶅拰瀵嗙爜
+ Subject subject = SecurityUtils.getSubject();
+ ShiroToken token = new ShiroToken(unionId,systemUser.getUsername(), null,true);
try {
subject.login(token);
loginLog.setUserId(((LoginUserInfo)subject.getPrincipal()).getId());
@@ -81,4 +178,6 @@
throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
}
}
+
+
}
--
Gitblit v1.9.3