package com.whyc.service; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.whyc.constant.UserConstant; import com.whyc.constant.YamlProperties; import com.whyc.dto.Response; import com.whyc.mapper.*; import com.whyc.pojo.*; import com.whyc.util.ActionUtil; import com.whyc.util.RSAUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RequestParam; import javax.annotation.Resource; import javax.servlet.ServletContext; import javax.servlet.http.HttpSession; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.security.InvalidParameterException; import java.util.*; @Service @Slf4j public class UserService { @Resource private UserMapper userMapper; @Resource private UserPermitGroupDataMapper permitMapper; @Resource private BaoJiGroupUserMapper baoJiGroupUserMapper; @Resource private UserBridgeService userBridgeService; @Autowired private ApplicationContext applicationContext; @Resource private PermitGroupUserService permitGroupUserService; @Resource private PageParamMapper pageParamMapper; public Response add(UserInf user) { try { UserInf userFound = userBridgeService.findPasswordByUserName(user.getUName()); if (userFound.getUId() != 0) { return new Response<>().set(1, false, "用户已存在"); } if (userMapper.addJudge(user.getUName(),user.getUMobilephone())>0){ return new Response<>().set(1, false, "用户已存在"); } //user.setCreateTime(new Date()); String[] dataArr = RSAUtil.decryptFrontP(user.getUpassword(), RSAUtil.fontSeparator); String password = dataArr[0]; String passwordMD5 = dataArr[1]; if(!ActionUtil.EncryptionMD5(password).equals(passwordMD5)){ throw new InvalidParameterException("参数校验失败"); } user.setUpassword(RSAUtil.encrypt(password,RSAUtil.getPublicKey())); int flag = userMapper.insert(user); if (flag > 0) { Integer uId= userMapper.getUserInfoByPhoneNumber(user.getUMobilephone()).getUId().intValue(); UserPermitGroupData permitGroupData = new UserPermitGroupData(); permitGroupData.setPermitGroupId(user.getPermitGroupId()); permitGroupData.setUId(uId); permitMapper.insert(permitGroupData); return new Response<>().set(1, true); } else { return new Response<>().set(1, false, "添加失败"); } }catch (Exception e){ e.printStackTrace(); return new Response<>().set(0); } } public Response addByRSA(UserInf user) { //首先校验当前用户所在的权限组,是否存在用户编辑权限 usr_edit_permit if (!checkUserPermit()) return new Response<>().set(1, false, "当前用户没有用户编辑权限"); try { UserInf userFound = userBridgeService.findPasswordByUserName(user.getUName()); if (userFound.getUId() != 0) { return new Response<>().set(1, false, "用户名已存在"); } UserInf userOfMobilephone = userBridgeService.findUserByMobilephone(user.getUMobilephone()); if (userOfMobilephone.getUId()!=0) { return new Response<>().set(1, false, "手机号已存在"); } //String password = URLDecoder.decode(user.getUpassword(), "utf-8"); String password = user.getUpassword(); String[] dataArr = RSAUtil.decryptFront(password, RSAUtil.fontSeparator); String pwd = RSAUtil.encrypt(dataArr[0],RSAUtil.getPublicKey()); user.setUpassword(pwd); user.setUSnId(pwd); user.setPasswordUpdateTime(new Date()); user.setCreateTime(new Date()); user.setLastLoginTime(new Date()); int flag = userMapper.insert(user); if (flag > 0) { //添加成功,分配到默认初始化权限组 Integer uId= userMapper.getUserInfoByPhoneNumber(user.getUMobilephone()).getUId().intValue(); UserPermitGroupData permitGroupData = new UserPermitGroupData(); permitGroupData.setPermitGroupId(user.getPermitGroupId()); permitGroupData.setUId(uId); permitMapper.insert(permitGroupData); return new Response<>().set(1, true); } else { return new Response<>().set(1, false, "添加失败"); } }catch (Exception e){ e.printStackTrace(); return new Response<>().set(0); } } private boolean checkUserPermit() { //首先校验当前用户所在的权限组,是否存在用户编辑权限 usr_edit_permit Long uId = ActionUtil.getUser().getUId(); List itemList = permitGroupUserService.getItemList(uId); if (!itemList.contains("usr_edit_permit")){ return false; } return true; } private boolean checkUserPermitWithQuery() { //首先校验当前用户所在的权限组,是否存在用户查询权限 usr_query_permit Long uId = ActionUtil.getUser().getUId(); List itemList = permitGroupUserService.getItemList(uId); if (!itemList.contains("usr_query_permit")){ return false; } return true; } public Response registerUser(UserInf user){ try { UserInf userFound = userBridgeService.findPasswordByUserName(user.getUName()); if (userFound.getUId() != 0) { return new Response<>().set(1, false, "用户名已存在"); } UserInf userOfMobilephone = userBridgeService.findUserByMobilephone(user.getUMobilephone()); if (userOfMobilephone.getUId()!=0) { return new Response<>().set(1, false, "手机号已存在"); } //String password = URLDecoder.decode(user.getUpassword(), "utf-8"); String password = user.getUpassword(); String[] dataArr = RSAUtil.decryptFront(password, RSAUtil.fontSeparator); String pwd = RSAUtil.encrypt(dataArr[0],RSAUtil.getPublicKey()); user.setUpassword(pwd); user.setUSnId(pwd); int flag = userMapper.insert(user); if (flag > 0) { //添加成功,分配到默认初始化权限组 Integer uId= userMapper.getUserInfoByPhoneNumber(user.getUMobilephone()).getUId().intValue(); UserPermitGroupData permitGroupData = new UserPermitGroupData(); permitGroupData.setPermitGroupId(100020); permitGroupData.setUId(uId); permitMapper.insert(permitGroupData); //添加成功,分配到默认的包机组 BaoJiGroupUser baoJiGroupUser = new BaoJiGroupUser(); baoJiGroupUser.setBaoJiGroupId(100091); baoJiGroupUser.setuId(uId); baoJiGroupUserMapper.insert(baoJiGroupUser); return new Response<>().set(1, true,"注册成功"); } else { return new Response<>().set(1, false, "注册失败"); } }catch (Exception e){ e.printStackTrace(); return new Response<>().set(0); } } public UserInf getById(int id) { return userMapper.selectById(id); } public List getAll() { List users = userMapper.selectList((Wrapper) ActionUtil.objeNull); return users; } public Response getAllWithPage(int pageNum,int pageSize) { //验证是否存在usr_query_permit权限 if (!checkUserPermitWithQuery()) { return new Response().set(1, false, "当前用户没有查询权限"); } PageHelper.startPage(pageNum,pageSize); List list = userMapper.getUserInfAndPermitInf(); for (UserInf uinf:list) { uinf.setUSnId("*******"); uinf.setUpassword("*******"); } PageInfo pageInfo = new PageInfo<>(list); return new Response().set(1,pageInfo,"查询成功"); } public Response update(UserInf user) { //首先校验当前用户所在的权限组,是否存在用户编辑权限 usr_edit_permit if (!checkUserPermit()) return new Response<>().set(1, false, "当前用户没有用户编辑权限"); //非系统管理员用户,禁止修改访问ip和访问时间 if(user.getUId()!=1 && user.getUName().equals("sys_admin")){ user.setVisitIp((String) ActionUtil.objeNull); user.setVisitTime((String) ActionUtil.objeNull); } UserInf userFound = userBridgeService.findPasswordByUserName(user.getUName()); UserInf userOfMobilephone = userBridgeService.findUserByMobilephone(user.getUMobilephone()); if (userFound.getUId() != 0 && !userFound.getUId().equals(user.getUId())) { return new Response().set(1,false,"用户名重复"); } if( userOfMobilephone.getUId()!=0 && !userFound.getUId().equals(user.getUId())){ return new Response().set(1,false,"手机号重复"); } user.setUpassword(null); user.setUSnId(null); if(userMapper.updateById(user)>0){ return new Response().set(1,true,"修改成功"); }else{ return new Response().set(1,false,"修改失败"); } } @Transactional public boolean delete(int id) { //首先校验当前用户所在的权限组,是否存在用户编辑权限 usr_edit_permit if (!checkUserPermit()) return false; UpdateWrapper wrapper = new UpdateWrapper(); wrapper.eq("uId", id); //删除对应的包机组记录 baoJiGroupUserMapper.delete(wrapper); //删除对应的权限组记录 permitMapper.delete(wrapper); //删除用户 return userMapper.deleteById(id) > 0; } // 将所有登陆的用户的信息存到application中 public void setApplication(UserInf user) { ServletContext application = ActionUtil.getApplication(); //查看全局中存储的users的Map的key-value集合 Map map = (Map) application.getAttribute("users"); if (map == ActionUtil.objeNull) { map = new HashMap(); } else { //如果集合中有值,则获取当前用户对应的用户信息,key为用户名username,Value为用户名,存储的时间 UserClient client = map.get(user.getUName()); if (client != ActionUtil.objeNull) { //已存在 map.remove(user.getUName()); } } Long login_time = new Date().getTime(); ActionUtil.getSession().setAttribute("login_time", login_time); map.put(user.getUName(), new UserClient(ActionUtil.getRequest().getRemoteAddr(),user,login_time)); application.setAttribute("users", map); } public UserInf getUserByUKeyId(String uKeyId){ QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("uKey_ID",uKeyId); queryWrapper.last("limit 1"); UserInf userInf = userMapper.selectOne(queryWrapper); return userInf; } public UserInf getUserByUserName(String userName){ QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("Uname",userName); queryWrapper.last("limit 1"); UserInf userInf = userMapper.selectOne(queryWrapper); return userInf; } public boolean bindUkey(UserInf userInf){ UpdateWrapper updateWrapper = new UpdateWrapper(); updateWrapper.set("uKey_ID",userInf.getUkeyId()); updateWrapper.eq("uName",userInf.getUName()); int affectRows = userMapper.update((UserInf) ActionUtil.objeNull,updateWrapper); return affectRows>0; } public Response updatePassword(UserInf userInf,String password){ String[] dataArr = RSAUtil.decryptFrontP(password, RSAUtil.fontSeparator); password = dataArr[0]; String passwordMD5 = dataArr[1]; if(!ActionUtil.EncryptionMD5(password).equals(passwordMD5)){ throw new InvalidParameterException("参数校验失败"); } String pwd = RSAUtil.encrypt(password,RSAUtil.getPublicKey()); userInf.setUpassword(pwd); userInf.setUSnId(pwd); if (userMapper.updateById(userInf)>0){ return new Response().set(1,"修改成功"); }else { return new Response().set(0,"修改失败"); } } public Response updatePasswordByRSA(UserInf user,String newPwd){ String[] dataArr = RSAUtil.decryptFrontP(newPwd, RSAUtil.fontSeparator); newPwd = dataArr[0]; String passwordMD5 = dataArr[1]; if(!ActionUtil.EncryptionMD5(newPwd).equals(passwordMD5)){ throw new InvalidParameterException("参数校验失败"); } if(!ActionUtil.filterPwd(newPwd)){ return new Response().set(0,false,"新密码验证不通过(最少8个字符,至少1个大写字母,1个小写字母,1个数字和1个特殊字符)"); } String pwd = RSAUtil.encrypt(newPwd,RSAUtil.getPublicKey()); user.setUpassword(pwd); user.setUSnId(pwd); user.setPasswordUpdateTime(new Date()); if (userMapper.updateById(user)>0){ return new Response().set(1,true,"新密码修改成功"); }else { return new Response().set(0,false,"新密码修改失败"); } } //密码失效修改密码 public Response updatePasswordByValidity(String uname, String oldPwd, String newPwd) throws UnsupportedEncodingException { //验证旧密码是否正确 QueryWrapper queryWrapper = Wrappers.query(); queryWrapper.select("uid","upassword").eq("uName",uname).last(" limit 1"); UserInf user=userMapper.selectOne(queryWrapper); if(user==null){ return new Response().set(0,false,"用户不存在"); } String passwordDB =user.getUpassword(); oldPwd = RSAUtil.decryptFront(oldPwd, RSAUtil.fontSeparator)[0]; if(!RSAUtil.decrypt(passwordDB,RSAUtil.getPrivateKey()).equals(oldPwd)){ return new Response().set(0,false,"旧密码输入错误"); } String[] dataArr = RSAUtil.decryptFrontP(newPwd, RSAUtil.fontSeparator); newPwd = dataArr[0]; String passwordMD5 = dataArr[1]; if(!ActionUtil.filterPwd(newPwd)){ return new Response().set(0,false,"新密码验证不通过(最少8个字符,至少1个大写字母,1个小写字母,1个数字和1个特殊字符)"); } if(!ActionUtil.EncryptionMD5(newPwd).equals(passwordMD5)){ throw new InvalidParameterException("参数校验失败"); } String pwd = RSAUtil.encrypt(newPwd,RSAUtil.getPublicKey()); user.setUpassword(pwd); user.setUSnId(pwd); user.setPasswordUpdateTime(new Date()); if (userMapper.updateById(user)>0){ return new Response().set(1,true,"新密码修改成功"); }else { return new Response().set(0,false,"新密码修改失败"); } } public Response updatePassword2(UserInf userInf, String passwordOld, String passwordNew) { //检查旧密码 QueryWrapper queryWrapper = Wrappers.query(); queryWrapper.select("upassword").eq("uName",userInf.getUName()).last(" limit 1"); String passwordDB = userMapper.selectOne(queryWrapper).getUpassword(); if(!RSAUtil.decrypt(passwordDB,RSAUtil.getPrivateKey()).equals(passwordOld)){ return new Response().set(1,false,"旧密码输入错误"); } //更新新密码 UpdateWrapper updateWrapper = Wrappers.update(); updateWrapper.set("upassword",RSAUtil.encrypt(passwordNew,RSAUtil.getPublicKey())).set("password_update_time",new Date()).eq("uName",userInf.getUName()); userMapper.update((UserInf) ActionUtil.objeNull,updateWrapper); return new Response().set(1,true,"密码修改成功"); } /**锁定账号*/ public void lock(Long uId) { UpdateWrapper wrapper = Wrappers.update(); wrapper.set("status", UserConstant.ACCOUNT_STATUS_LOCK_FAIL.getValue()).set("lock_time",new Date()).eq("uId",uId); userMapper.update((UserInf) ActionUtil.objeNull,wrapper); } /**更新登录时间*/ public void updateLoginTime(Long uId) { UpdateWrapper wrapper = Wrappers.update(); wrapper.set("last_login_time", new Date()).eq("uId",uId); userMapper.update((UserInf) ActionUtil.objeNull,wrapper); } public void updateExpiredAccount() { UpdateWrapper wrapper = Wrappers.update(); wrapper.set("status",UserConstant.ACCOUNT_STATUS_CANCEL.getValue()).eq("type",UserConstant.ACCOUNT_TYPE_TEMP.getValue()).gt("expiration_time",new Date()); userMapper.update((UserInf) ActionUtil.objeNull,wrapper); } public void unLock() { UpdateWrapper wrapper = Wrappers.update(); wrapper.set("status", UserConstant.ACCOUNT_STATUS_ACTIVE.getValue()).set("lock_time",null) .eq("status",UserConstant.ACCOUNT_STATUS_LOCK_FAIL.getValue()) .last(" and date_add(lock_time,interval 20 MINUTE) wrapper = Wrappers.update(); wrapper.set("status", status) .eq("status",UserConstant.ACCOUNT_STATUS_ACTIVE.getValue()) .last(" and date_add(last_login_time,interval 3 MONTH)100"); userMapper.update((UserInf) ActionUtil.objeNull,wrapper); } public void unLock(int uId, int unLockType) { UpdateWrapper wrapper = Wrappers.update(); wrapper.set("status",1).eq("uId",uId); if(unLockType==1){ wrapper.set("lock_time",ActionUtil.objeNull); }else{ wrapper.set("last_login_time",new Date()); } userMapper.update((UserInf) ActionUtil.objeNull,wrapper); } public List searchCS_All2() { return userMapper.searchCS_All2(); } public List getUserInfoByStationId(String stationId){ List list = userMapper.getUserInfoByStationId(stationId); return list; } public Response loginByUId(int uId) { Response response = new Response<>(); response.setCode(1); response.setData(false); //查询对应的用户 QueryWrapper query = Wrappers.query(); query.select("uId","uName","uSnId","upassword","unote","UKey_ID","uRole","password_update_time","status","visit_time","visit_ip") .eq("uId",uId).last(" limit 1"); UserInf userInf = userMapper.selectOne(query); if(userInf == ActionUtil.objeNull){ response.setMsg("对应的用户不存在"); }else{ //判断用户状态 if(userInf.getStatus()!=1){ switch (userInf.getStatus()){ case 0: response.setMsg("当前账号的状态异常,无法登录. 异常信息为: "+UserConstant.ACCOUNT_STATUS_CANCEL.getLabel());break; case 2: response.setMsg("当前账号的状态异常,无法登录. 异常信息为: "+UserConstant.ACCOUNT_STATUS_HIBERNATE.getLabel());break; case 3: response.setMsg("当前账号的状态异常,无法登录. 异常信息为: "+UserConstant.ACCOUNT_STATUS_LOCK.getLabel());break; case 4: response.setMsg("当前账号的状态异常,无法登录. 异常信息为: "+UserConstant.ACCOUNT_STATUS_LOCK_FAIL.getLabel());break; default:response.setMsg("当前账号的状态异常,无法登录. 异常信息为: 无"); } return response; } //判断是否为国网系统,校验密码是否3个月修改过一次 if(1 == YamlProperties.systemType){ //登录之前,首先校验允许时间和登录ip boolean ipPass = true; String firstTime = userInf.getVisitTime().split("~")[0]; String lastTime = userInf.getVisitTime().split("~")[1]; List ipRules = new LinkedList<>(); String ipRuleStr = userInf.getVisitIp(); ipRules = Arrays.asList(ipRuleStr.split(",")); Calendar instance = Calendar.getInstance(); String hourOfDay = String.format("%1$02d",instance.get(Calendar.HOUR_OF_DAY)); int minute = instance.get(Calendar.MINUTE); int second = instance.get(Calendar.SECOND); String nowTime = hourOfDay+":"+minute+":"+second; //登录时间校验 if(nowTime.compareTo(firstTime)>=0 && nowTime.compareTo(lastTime)<=0){ //登录ip校验 String clientIp = ActionUtil.getRequest().getRemoteAddr(); if(!ipRules.contains("*")){ for(String ipRule:ipRules){ ipPass = true; //ip规则格式为 * 或者 xxx.xxx.x.x String[] ipArr = clientIp.split("\\."); String[] ipRuleArr = ipRule.split("\\."); for (int i = 0; i < ipRuleArr.length; i++) { if(!ipRuleArr[i].equals("*") && !ipRuleArr[i].equals(ipArr[i])){ ipPass = false; break; } } if(ipPass){ break; } } } if(!ipPass){ return response.set(1,false,"您的IP禁止访问,请知晓"); } }else{ return response.set(1,false,"登录时间不在允许的时间范围内"); } } //校验通过,登录成功 { response.setData(true); //查询用户对应的权限组id并返回给前端 QueryWrapper query2 = Wrappers.query(); query2.select("permit_group_id").eq("uId",uId).last(" limit 1"); UserPermitGroupData userPermitGroupData = permitMapper.selectOne(query2); response.setData2(userPermitGroupData.getPermitGroupId()); //将登陆成功的用户存入session HttpSession session = ActionUtil.getSession(); session.setAttribute("user",userInf); session.setAttribute("ip",ActionUtil.getRequest().getRemoteAddr()); List permitGroupList = permitMapper.getPermitGroupListByUId(uId); if(permitGroupList!=ActionUtil.objeNull && permitGroupList.size()>0){ session.setAttribute("permits", ActionUtil.tojson(permitGroupList)); }else{ response.setMsg("还未分配权限"); return response; } //将新登录的用户存入application setApplication(userInf); //特定的用户信息返回 UserInf userDto = new UserInf(); userDto.setUId(userInf.getUId()); userDto.setURole(userInf.getURole()); userDto.setUName(userInf.getUName()); response.setData3(userDto); } } return response; } public void updatePasswordsTo3072(List userListWithNewPwd) { userMapper.updatePasswordsTo3072(userListWithNewPwd); } //验证密码的时效性 public int checkPasswordValidity(UserInf uinf) { int flag=1; //获取系统设置的密码时效(57,15) QueryWrapper wrapper=new QueryWrapper(); wrapper.eq("categoryId",15); wrapper.eq("id",57); wrapper.last("limit 1"); PageParam pageParam=pageParamMapper.selectOne(wrapper); if(pageParam!=null){ int dayDifference=ActionUtil.daysBetween(uinf.getPasswordUpdateTime(),new Date()); if((pageParam.getStatus()>0)&&(dayDifference>pageParam.getStatus())){ flag= -1; } } return flag; } }