package com.doumee.service.system.impl; import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.api.R; import com.doumee.config.shiro.ShiroToken; import com.doumee.core.constants.ResponseStatus; import com.doumee.core.exception.BusinessException; import com.doumee.core.model.LoginUserInfo; import com.doumee.core.utils.Constants; import com.doumee.core.utils.Utils; import com.doumee.core.wx.WxMiniConfig; import com.doumee.dao.business.SmsEmailMapper; import com.doumee.dao.system.SystemUserMapper; import com.doumee.dao.system.dto.LoginDTO; import com.doumee.dao.system.dto.LoginPhoneDTO; import com.doumee.dao.system.dto.WxMiniLoginDTO; import com.doumee.dao.system.model.SystemLoginLog; import com.doumee.dao.system.model.SystemUser; import com.doumee.service.business.impl.SmsEmailServiceImpl; import com.doumee.service.common.CaptchaService; import com.doumee.service.system.SystemLoginLogService; import com.doumee.service.system.SystemLoginService; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.error.WxErrorException; 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.stereotype.Service; import javax.servlet.http.HttpServletRequest; import java.util.Date; import java.util.Objects; @Slf4j @Service public class SystemLoginServiceImpl implements SystemLoginService { @Value("${project.version}") private String systemVersion; @Value("${debug_model}") private Boolean debugModel; @Autowired private SmsEmailMapper smsEmailMapper; @Autowired private CaptchaService captchaService; @Autowired private SystemLoginLogService systemLoginLogService; @Autowired private SystemUserMapper systemUserMapper; // /** // * 微信授权(登录后) // * @param code // */ // @Override // public String wxEmpower(String code,Integer userId){ // try { // //获取微信敏感数据 // WxMaJscode2SessionResult session = WxMiniConfig.wxMaService.getUserService().getSessionInfo(code); // String openId = session.getOpenid(); // if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isBlank(openId)) { // throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"获取openid失败!请联系管理员"); // } // if(Objects.nonNull(userId)){ // systemUserMapper.update(null,new UpdateWrapper() // .lambda() // .set(SystemUser::getOpenid,null) // .eq(SystemUser::getOpenid,openId) // .ne(SystemUser::getId,userId)); // // systemUserMapper.update(null,new UpdateWrapper() // .lambda() // .set(SystemUser::getOpenid,openId) // .eq(SystemUser::getId,userId)); // } // return openId; // } catch (WxErrorException e) { // throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"微信登录异常!请联系管理员"); // } // } @Override public void cleaOpenid(){ LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); if(StringUtils.isNotBlank(loginUserInfo.getOpenid())){ systemUserMapper.update(null,new UpdateWrapper().lambda() .set(SystemUser::getOpenid,null) .eq(SystemUser::getId,loginUserInfo.getId())); } } @Override public String loginByWxMini (WxMiniLoginDTO wxMiniLoginDTO, HttpServletRequest request){ LoginDTO dto = new LoginDTO(); if(StringUtils.isNotBlank(wxMiniLoginDTO.getCode())){ try{ WxMaJscode2SessionResult session = WxMiniConfig.wxMaService.getUserService().getSessionInfo(wxMiniLoginDTO.getCode()); String openId = session.getOpenid(); if (StringUtils.isNotBlank(openId)&&StringUtils.isBlank(wxMiniLoginDTO.getUsername())) { SystemUser systemUser = systemUserMapper.selectOne(new QueryWrapper() .lambda().eq(SystemUser::getOpenid,openId) .eq(SystemUser::getDeleted,Constants.ZERO) .eq(SystemUser::getType,Constants.UserType.COMPANY.getKey()) .orderByDesc(SystemUser::getCreateTime) .last(" limit 1") ); if(Objects.nonNull(systemUser)){ LoginPhoneDTO loginPhoneDTO = new LoginPhoneDTO(); loginPhoneDTO.setPhone(systemUser.getMobile()); return this.loginByPhone(loginPhoneDTO,Constants.ONE,false,request); }else{ return null; } }else{ dto.setOpenid(openId); } } catch (WxErrorException e) { throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"微信登录异常!请联系管理员"); } } if(StringUtils.isBlank(wxMiniLoginDTO.getUsername()) || StringUtils.isBlank(wxMiniLoginDTO.getPassword())){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } dto.setUsername(wxMiniLoginDTO.getUsername()); dto.setPassword(wxMiniLoginDTO.getPassword()); return this.loginByPassword(dto,Constants.ONE,false,request); } @Override public String loginByPassword(LoginDTO dto, int type,Boolean checkCaptcha,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()); // 校验验证码 try { if(!debugModel&&checkCaptcha){ captchaService.check(dto.getUuid(), dto.getCode()); } } catch (Exception e) { log.error(e.getMessage(), e); loginLog.setReason(e.getMessage().length() > 200 ? (e.getMessage().substring(0, 190) + "...") : e.getMessage()); loginLog.setSuccess(Boolean.FALSE); systemLoginLogService.create(loginLog); throw e; } // 校验用户名和密码 Subject subject = SecurityUtils.getSubject(); ShiroToken token = new ShiroToken(dto.getUsername(), dto.getPassword(),true,type); try { subject.login(token); loginLog.setUserId(((LoginUserInfo)subject.getPrincipal()).getId()); loginLog.setSuccess(Boolean.TRUE); systemLoginLogService.create(loginLog); //更新openid所属用户信息 if(StringUtils.isNotBlank(dto.getOpenid())){ systemUserMapper.update(null,new UpdateWrapper().lambda() .set(SystemUser::getOpenid,null) .eq(SystemUser::getOpenid,dto.getOpenid()) .ne(SystemUser::getId,loginLog.getUserId())); systemUserMapper.update(null,new UpdateWrapper().lambda() .set(SystemUser::getOpenid,dto.getOpenid()) .eq(SystemUser::getId,loginLog.getUserId())); } 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.getCode(), Objects.isNull(e.getCause())?ResponseStatus.ACCOUNT_INCORRECT.getMessage():e.getCause().getMessage()); } } @Override public String loginByPhone (LoginPhoneDTO dto, int type,Boolean checkSmsCode, HttpServletRequest request) { SystemLoginLog loginLog = new SystemLoginLog(); loginLog.setLoginUsername(dto.getPhone()); 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()); // 校验验证码 try { if(!debugModel&& checkSmsCode){ SmsEmailServiceImpl.isCaptcheValide(smsEmailMapper,dto.getPhone(), dto.getCode()); } } catch (Exception e) { log.error(e.getMessage(), e); loginLog.setReason(e.getMessage().length() > 200 ? (e.getMessage().substring(0, 190) + "...") : e.getMessage()); loginLog.setSuccess(Boolean.FALSE); systemLoginLogService.create(loginLog); throw e; } // 校验用户名和密码 Subject subject = SecurityUtils.getSubject(); ShiroToken token = new ShiroToken(dto.getPhone(), null,false,type); try { subject.login(token); loginLog.setUserId(((LoginUserInfo)subject.getPrincipal()).getId()); loginLog.setSuccess(Boolean.TRUE); systemLoginLogService.create(loginLog); 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.getCode(), Objects.isNull(e.getCause())?ResponseStatus.ACCOUNT_INCORRECT.getMessage():e.getCause().getMessage()); } } }