ludc
2023-03-27 82a410d9ec7a5d15eed27e9990cff371feab43a1
Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java
@@ -21,7 +21,7 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;
import org.springblade.common.constant.CommonConstant;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.base.BaseServiceImpl;
@@ -50,6 +50,7 @@
import org.springblade.system.user.service.IUserService;
import org.springblade.system.user.vo.UserVO;
import org.springblade.system.user.wrapper.UserWrapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;
@@ -64,7 +65,7 @@
 * @author Chill
 */
@Service
@AllArgsConstructor
@RequiredArgsConstructor
public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implements IUserService {
   private static final String GUEST_NAME = "guest";
@@ -72,6 +73,10 @@
   private final IUserOauthService userOauthService;
   private final ISysClient sysClient;
   private final BladeTenantProperties tenantProperties;
   //拿到配置的超管id
   @Value("${user-info.id}")
   private String adminUserId;
   @Override
   @Transactional(rollbackFor = Exception.class)
@@ -293,7 +298,6 @@
   @Override
   public boolean updatePassword(Long userId, String oldPassword, String newPassword, String newPassword1) {
      String hex = DigestUtil.hex(DigestUtils.md5DigestAsHex((newPassword1).getBytes()));
      User user = getById(userId);
      if (!newPassword.equals(newPassword1)) {
         throw new ServiceException("请输入正确的确认密码!");
@@ -303,19 +307,38 @@
      }
      //获取用户采用的密码策略
      Strategy strategy = sysClient.getByUserId(userId).getData();
      String resException = "密码中必须含有【"+strategy.getCombinationIds()+"】中的【"+strategy.getRequiredType()+"】种密码组合方式,且密码长度必须在【"+strategy.getMinPwdLen()+"-"+strategy.getMaxPwdLen()+"】范围内";
      //密码长度校验
      if(newPassword1.length() < strategy.getMinPwdLen() || newPassword1.length() > strategy.getMaxPwdLen()){
         throw new ServiceException("密码中必须含有【"+strategy.getCombinationNames()+"】中的【"+strategy.getRequiredType()+"】种密码组合方式,且密码长度必须在【"+strategy.getMinPwdLen()+"-"+strategy.getMaxPwdLen()+"】范围内");
      }
      List<String> regexs = sysClient.getRegexByList(Arrays.asList(strategy.getCombinationIds().split(","))).getData();
      //判断是否满足组合方式中的必填种类数
      int reqType = 0;
      for (int i = 0; i < regexs.size(); i++) {
         if(reqType>=strategy.getRequiredType()){
            break;
         }
         if(!Func.isEmpty(RegexUtil.findResult(regexs.get(i),newPassword1))){
            reqType++;
         }
      }
      String resException = "密码中必须含有【"+strategy.getCombinationNames()+"】中的【"+strategy.getRequiredType()+"】种类型,请重新输入密码!";
      if(reqType<strategy.getRequiredType()){
         throw new ServiceException(resException);
      }
      //查询密码策略取值
      // 是否属于组合方式中的类型
      String regex = sysClient.getRegex(Arrays.asList(strategy.getCombinationIds().split(","))).getData();
      System.out.println("===============regex================"+regex);
      regex = "^"+regex+"$";
      String result = RegexUtil.findResult(regex, newPassword);
      System.out.println(result);
      return this.update(Wrappers.<User>update().lambda().set(User::getPassword, DigestUtil.hex(DigestUtils.md5DigestAsHex((newPassword1).getBytes()))).eq(User::getId, userId));
      //return true;
      regex = "^"+regex+"{"+strategy.getRequiredType()+",}$";
      boolean result = RegexUtil.find(regex, newPassword1);
      if(!result){
         throw new ServiceException(resException);
      }
      //修改密码同时,改变用户信息中的密码修改状态字段,密码修改时间
      return this.update(Wrappers.<User>update().lambda()
         .set(User::getPassword, DigestUtil.hex(DigestUtils.md5DigestAsHex((newPassword1).getBytes())))
         .set(User::getStrategyUpdateStatus,CommonConstant.TOP_PARENT_ID)
         .set(User::getPwdUpdateTime,new Date())
         .eq(User::getId, userId));
   }
   @Override
@@ -454,6 +477,10 @@
   @Override
   public Long checkRenAndExpr(Long userId) {
      //超级管理员直接返回不需要提醒密码修改
      if(adminUserId.equals(userId)){
         return 0L;
      }
      //获取到密码修改时间
      Date pwdUpdateTime = this.getOne(Wrappers.<User>query().eq("ID", userId)).getPwdUpdateTime();
      Long pwdupdateday = 0L;
@@ -461,13 +488,9 @@
         pwdupdateday = dateToDay(pwdUpdateTime);
      }
      Strategy strategy = sysClient.getByUserId(userId).getData();
      System.out.println("当前时间=================="+dateToDay(new Date()));
      System.out.println("密码修改时间======================"+pwdupdateday);
      System.out.println("提醒时间======================"+strategy.getReminderTime());
      System.out.println("过期时间======================="+strategy.getExpirationTime());
      //是否提醒通过最后一次修改密码的时间加上过期时间减去当前时间,如果小于过期提醒时间就进行提醒,如果<=0就提醒必须修改密码
      long reminder = pwdupdateday+strategy.getExpirationTime()-dateToDay(pwdUpdateTime);
      //必须去修改密码
      //提醒用户必须修改密码
      if(reminder<=0){
         return -1L;
      }
@@ -480,6 +503,11 @@
      return 0L;
   }
   /**
    * 时间格式转天
    * @param date
    * @return
    */
   private Long dateToDay(Date date){
      long time = date.getTime();
      return time/(1000 * 60 * 60 * 24);