package doumeemes.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 doumeemes.biz.system.SystemDictDataBiz;
|
import doumeemes.config.shiro.ShiroToken;
|
import doumeemes.core.constants.ResponseStatus;
|
import doumeemes.core.exception.BusinessException;
|
import doumeemes.core.model.LoginUserInfo;
|
import doumeemes.core.utils.Constants;
|
import doumeemes.core.utils.HttpsUtil;
|
import doumeemes.core.utils.Utils;
|
import doumeemes.dao.business.model.Company;
|
import doumeemes.dao.business.model.CompanyUser;
|
import doumeemes.dao.business.model.Department;
|
import doumeemes.dao.ext.CompanyExtMapper;
|
import doumeemes.dao.ext.CompanyUserExtMapper;
|
import doumeemes.dao.ext.DepartmentExtMapper;
|
import doumeemes.dao.ext.dto.QueryCompanyUserExtDTO;
|
import doumeemes.dao.ext.dto.WxLoginDTO;
|
import doumeemes.dao.ext.vo.CompanyUserExtListVO;
|
import doumeemes.dao.ext.vo.WxLoginVO;
|
import doumeemes.dao.system.SystemUserMapper;
|
import doumeemes.dao.system.dto.LoginDTO;
|
import doumeemes.dao.system.model.SystemLoginLog;
|
import doumeemes.dao.system.model.SystemUser;
|
import doumeemes.service.common.CaptchaService;
|
import doumeemes.service.ext.CompanyExtService;
|
import doumeemes.service.ext.CompanyUserExtService;
|
import doumeemes.service.system.SystemLoginLogService;
|
import doumeemes.service.system.WxLoginService;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.lang3.StringUtils;
|
import org.apache.shiro.SecurityUtils;
|
import org.apache.shiro.authc.AuthenticationException;
|
import org.apache.shiro.subject.Subject;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.context.annotation.Lazy;
|
import org.springframework.stereotype.Service;
|
|
import javax.servlet.http.HttpServletRequest;
|
import java.util.Date;
|
import java.util.Objects;
|
|
/**
|
* Created by IntelliJ IDEA.
|
*
|
* @Author : Rk
|
* @create 2023/8/11 10:14
|
*/
|
@Slf4j
|
@Service
|
public class WxLoginServiceImpl implements WxLoginService {
|
|
@Autowired
|
private SystemDictDataBiz systemDictDataBiz;
|
|
|
@Value("${project.version}")
|
private String systemVersion;
|
|
@Autowired
|
private CompanyUserExtMapper companyUserExtMapper;
|
@Autowired
|
private SystemUserMapper systemUserMapper;
|
@Autowired
|
private DepartmentExtMapper departmentExtMapper;
|
|
@Autowired
|
private SystemLoginLogService systemLoginLogService;
|
@Autowired
|
private CompanyExtMapper companyExtMapper;
|
|
|
/**
|
* 微信公众号获取TOKEN地址
|
*/
|
public static final String GET_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
|
|
/**
|
* 微信公众号获取USERINFO信息地址
|
*/
|
public static final String GET_USER_INFO_URL = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
|
|
|
@Override
|
public WxLoginVO wxLogin(String code, HttpServletRequest request) {
|
WxLoginVO wxLoginVO = new WxLoginVO();
|
String appId = systemDictDataBiz.queryByCode(Constants.WX_CONFIG,Constants.APPID).getCode();
|
String appSecret = systemDictDataBiz.queryByCode(Constants.WX_CONFIG,Constants.APPSECRET).getCode();
|
String getTokenUrl = GET_ACCESS_TOKEN_URL.replace("CODE", code).replace("APPID", appId).replace("SECRET", appSecret);
|
JSONObject tokenJson = JSONObject.parseObject(HttpsUtil.get(getTokenUrl,true));
|
if(Objects.isNull(tokenJson.get("access_token"))){
|
throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),tokenJson.getString("errmsg"));
|
}
|
String accessToken = tokenJson.getString("access_token");
|
String openId = tokenJson.getString("openid");
|
String getUserInfoUrl = GET_USER_INFO_URL.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId);
|
JSONObject userInfoJson = JSONObject.parseObject(HttpsUtil.get(getUserInfoUrl,true));
|
wxLoginVO.setOpenid(openId);
|
wxLoginVO.setUnionid(userInfoJson.getString("unionid"));
|
CompanyUser companyUser = companyUserExtMapper.selectOne(new QueryWrapper<CompanyUser>().eq("openid",openId).last(" limit 1 "));
|
if(Objects.isNull(companyUser)){
|
wxLoginVO.setLoginStatus(Constants.ONE);
|
return wxLoginVO;
|
}
|
Department department = departmentExtMapper.selectById(companyUser.getRootDepartId());
|
if(Objects.isNull(department)){
|
throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到绑定部门信息");
|
}
|
Company company = companyExtMapper.selectById(department.getCompanyId());
|
if(Objects.isNull(company)||company.getStatus().equals(Constants.ONE)){
|
wxLoginVO.setLoginStatus(Constants.ONE);
|
return wxLoginVO;
|
}
|
SystemUser systemUser = systemUserMapper.selectById(companyUser.getUserId());
|
//查询用户数据
|
LoginDTO dto = new LoginDTO();
|
dto.setCompanyId(department.getCompanyId());
|
dto.setUsername(systemUser.getUsername());
|
SystemLoginLog loginLog = new SystemLoginLog();
|
loginLog.setLoginUsername(dto.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(dto.getCompanyId(),dto.getUsername(), null,false,true);
|
try {
|
subject.login(token);
|
LoginUserInfo loginUser = ((LoginUserInfo)subject.getPrincipal());
|
loginLog.setUserId(loginUser.getId());
|
loginLog.setCompanyId(loginUser.getCompany()!=null?loginUser.getCompany().getId():null);
|
loginLog.setCompanyUserId(loginUser.getCompanyUser()!=null?loginUser.getCompanyUser().getId():null);
|
loginLog.setSuccess(Boolean.TRUE);
|
systemLoginLogService.create(loginLog);
|
String session = (String)subject.getSession().getId();
|
wxLoginVO.setLoginStatus(Constants.ZERO);
|
wxLoginVO.setSession(session);
|
return wxLoginVO;
|
}catch (BusinessException e) {
|
wxLoginVO.setLoginStatus(Constants.ONE);
|
return wxLoginVO;
|
}catch (AuthenticationException e) {
|
BusinessException ee = null;
|
loginLog.setSuccess(Boolean.FALSE);
|
if(e.getCause()!=null && e.getCause() instanceof BusinessException){
|
ee = (BusinessException)e.getCause();
|
loginLog.setReason(ee.getMessage().length() > 200 ? (ee.getMessage().substring(0, 190) + "...") : ee.getMessage());
|
log.error(ee.getMessage(), e);
|
}else{
|
log.error(ResponseStatus.ACCOUNT_INCORRECT.getMessage(), e);
|
loginLog.setReason(e.getMessage().length() > 200 ? (e.getMessage().substring(0, 190) + "...") : e.getMessage());
|
ee = new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
|
}
|
systemLoginLogService.create(loginLog);
|
throw ee;
|
}
|
}
|
|
|
|
@Override
|
public String wxLoginByPassword(WxLoginDTO dto, HttpServletRequest request) {
|
SystemLoginLog loginLog = new SystemLoginLog();
|
loginLog.setLoginUsername(dto.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(dto.getCompanyId(),dto.getUsername(), dto.getPassword(),false,false);
|
try {
|
subject.login(token);
|
LoginUserInfo loginUser = ((LoginUserInfo)subject.getPrincipal());
|
loginLog.setUserId(loginUser.getId());
|
loginLog.setCompanyId(loginUser.getCompany()!=null?loginUser.getCompany().getId():null);
|
loginLog.setCompanyUserId(loginUser.getCompanyUser()!=null?loginUser.getCompanyUser().getId():null);
|
loginLog.setSuccess(Boolean.TRUE);
|
systemLoginLogService.create(loginLog);
|
//登录携带微信openid信息
|
if(StringUtils.isNotBlank(dto.getOpenid())){
|
CompanyUser companyUser = companyUserExtMapper.selectById(loginLog.getCompanyUserId());
|
if(StringUtils.isBlank(companyUser.getOpenid())||!companyUser.getOpenid().equals(dto.getOpenid())){
|
//1、绑定微信openid到companyUser表信息
|
companyUser.setOpenid(dto.getOpenid());
|
companyUser.setUnionid(dto.getUnionid());
|
companyUserExtMapper.updateById(companyUser);
|
//2、清空同用户其余companyUser表openid与 unionid
|
companyUserExtMapper.update(null,new UpdateWrapper<CompanyUser>()
|
.ne("ID",companyUser.getId()).set("UNIONID","").set("OPENID","")
|
.eq("USER_ID",companyUser.getUserId())
|
);
|
}
|
}
|
return (String)subject.getSession().getId();
|
}catch (AuthenticationException e) {
|
BusinessException ee = null;
|
loginLog.setSuccess(Boolean.FALSE);
|
if(e.getCause()!=null && e.getCause() instanceof BusinessException){
|
ee = (BusinessException)e.getCause();
|
loginLog.setReason(ee.getMessage().length() > 200 ? (ee.getMessage().substring(0, 190) + "...") : ee.getMessage());
|
log.error(ee.getMessage(), e);
|
}else{
|
log.error(ResponseStatus.ACCOUNT_INCORRECT.getMessage(), e);
|
loginLog.setReason(e.getMessage().length() > 200 ? (e.getMessage().substring(0, 190) + "...") : e.getMessage());
|
ee = new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
|
}
|
systemLoginLogService.create(loginLog);
|
throw ee;
|
}
|
}
|
|
}
|