package com.doumee.service.system.impl;
|
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
import com.doumee.biz.system.SystemDictDataBiz;
|
import com.doumee.core.constants.Constants;
|
import com.doumee.core.constants.ResponseStatus;
|
import com.doumee.core.exception.BusinessException;
|
import com.doumee.core.model.LoginUserInfo;
|
import com.doumee.core.utils.DateUtil;
|
import com.doumee.core.utils.Utils;
|
import com.doumee.dao.business.MemberMapper;
|
import com.doumee.dao.business.model.Member;
|
import com.doumee.dao.system.SystemUserMapper;
|
import com.doumee.dao.system.dto.LoginDTO;
|
import com.doumee.dao.system.dto.WebLoginDTO;
|
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.doumee.service.system.SystemUserService;
|
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.authc.UsernamePasswordToken;
|
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;
|
|
@Slf4j
|
@Service
|
public class SystemLoginServiceImpl implements SystemLoginService {
|
|
@Value("${project.version}")
|
private String systemVersion;
|
|
|
@Autowired
|
private SystemUserMapper systemUserMapper;
|
@Autowired
|
private CaptchaService captchaService;
|
@Autowired
|
private MemberMapper memberMapper;
|
|
@Autowired
|
private SystemUserService systemUserService;
|
|
@Autowired
|
private SystemLoginLogService systemLoginLogService;
|
|
|
@Lazy
|
@Autowired
|
private SystemDictDataBiz systemDictDataBiz;
|
|
|
@Value("${debug_model}")
|
private Boolean debugModel;
|
|
@Override
|
public String loginByPassword(LoginDTO dto, HttpServletRequest request) {
|
return doLogin(dto,true,request);
|
}
|
@Override
|
public String loginByPasswordWeb(WebLoginDTO dto, HttpServletRequest request) {
|
LoginDTO d = new LoginDTO();
|
d.setPassword(dto.getPassword());
|
d.setUsername(dto.getUsername());
|
|
return doLogin(d,false,request);
|
|
}
|
@Override
|
public void logoutWx(String memberId){
|
memberMapper.update(null,new UpdateWrapper<Member>().lambda()
|
.set(Member::getSysuserId,null)
|
.eq(Member::getId,memberId));//解除绑定前端用户openId关系
|
}
|
@Override
|
public SystemUser loginByPasswordWx(WebLoginDTO dto, HttpServletRequest request) {
|
if(StringUtils.isBlank(dto.getUsername())
|
||StringUtils.isBlank(dto.getPassword())){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST);
|
}
|
SystemLoginLog loginLog = new SystemLoginLog();
|
loginLog.setLoginUsername(dto.getUsername());
|
loginLog.setLoginTime(new Date());
|
loginLog.setSystemVersion(systemVersion);
|
loginLog.setIp(Utils.User_Client.getIP(request));
|
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 {
|
SystemUser s = new SystemUser();
|
s.setUsername(dto.getUsername());
|
SystemUser systemUser =systemUserService.findOne(s);
|
if(systemUser ==null){
|
throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT.getCode(), "对不起,账号或密码错误!");
|
}
|
if (!StringUtils.equals(systemUser.getPassword(),Utils.Secure.encryptPassword(dto.getPassword(), systemUser.getSalt()))) {
|
throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT.getCode(), "对不起,账号或密码错误");
|
}
|
if(Objects.equals(s.getStatus(),Constants.ONE)){
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"登录账号已禁用,请联系管理员!");
|
}
|
memberMapper.update(null,new UpdateWrapper<Member>().lambda()
|
.set(Member::getSysuserId,systemUser.getId())
|
.eq(Member::getId,dto.getMemberId()));//绑定前端用户openId关系
|
|
return systemUser;
|
/* SystemUser u = new SystemUser();
|
u.setLastLogin(DateUtil.getCurrentDate());
|
u.setId(systemUser.getId());
|
systemUserService.updateById(u);//更新最后登录时间
|
|
loginLog.setUserId(u.getId());
|
loginLog.setSuccess(Constants.ZERO);
|
systemLoginLogService.create(loginLog);//登录日志*/
|
} catch (Exception e) {
|
e.printStackTrace();
|
log.error(ResponseStatus.ACCOUNT_INCORRECT.getMessage(), e);
|
loginLog.setReason(e.getMessage().length() > 200 ? (e.getMessage().substring(0, 190) + "...") : e.getMessage());
|
loginLog.setSuccess(Constants.ONE);
|
systemLoginLogService.create(loginLog);
|
if (e.getCause() instanceof BusinessException) {
|
throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT.getCode(), e.getCause().getMessage());
|
}
|
throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT.getCode(), "对不起,账号或密码错误!");
|
}
|
}
|
public String doLogin(LoginDTO dto,boolean needCheckCode, HttpServletRequest request) {
|
if(StringUtils.isBlank(dto.getUsername())
|
||StringUtils.isBlank(dto.getPassword())
|
||(needCheckCode &&StringUtils.isBlank(dto.getCode()))){
|
throw new BusinessException(ResponseStatus.BAD_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());
|
if(needCheckCode){
|
// 校验验证码
|
if(!debugModel) {
|
try {
|
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(Constants.ZERO);
|
systemLoginLogService.create(loginLog);
|
throw e;
|
}
|
}
|
}
|
|
// 校验用户名和密码
|
Subject subject = SecurityUtils.getSubject();
|
UsernamePasswordToken token = new UsernamePasswordToken(dto.getUsername(), dto.getPassword());
|
try {
|
subject.login(token);
|
SystemUser u = new SystemUser();
|
u.setLastLogin(DateUtil.getCurrentDate());
|
u.setId(loginLog.getUserId());
|
systemUserService.updateLoginDate(u);
|
|
loginLog.setUserId(((LoginUserInfo)subject.getPrincipal()).getId());
|
loginLog.setSuccess(Constants.ZERO);
|
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(Constants.ONE);
|
systemLoginLogService.create(loginLog);
|
if (e.getCause() instanceof BusinessException) {
|
throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT.getCode(), e.getCause().getMessage());
|
}
|
throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT.getCode(), "对不起,账号或密码错误!");
|
}
|
}
|
|
}
|