ludc
2023-03-24 0baeb5d2b147bf29add1e5373652ae70dd749b69
更新密码策略功能
已修改36个文件
已添加2个文件
735 ■■■■ 文件已修改
Source/BladeX/blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetails.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetailsServiceImpl.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-auth/src/main/java/org/springblade/auth/support/BladeJwtTokenEnhancer.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-auth/src/main/java/org/springblade/auth/utils/TokenUtil.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Strategy.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/UserPwdstrategy.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClient.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClientFallback.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/UserPwdstrategyVO.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/entity/User.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/controller/StrategyController.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/controller/UserPwdstrategyController.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/controller/ValueRangeController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/feign/SysClient.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/CombinationMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/CombinationMapper.xml 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/StrategyMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/StrategyMapper.xml 70 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/UserPwdstrategyMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/UserPwdstrategyMapper.xml 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/ValueRangeMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/ValueRangeMapper.xml 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/ICombinationService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/IStrategyService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/IUserPwdstrategyService.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/IValueRangeService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/CombinationServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/StrategyServiceImpl.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/TenantServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/UserPwdstrategyServiceImpl.java 54 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/ValueRangeServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/controller/UserController.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/feign/UserClient.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/mapper/UserMapper.xml 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/service/IUserService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/BladeX/blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetails.java
@@ -79,6 +79,28 @@
     * ç”¨æˆ·è¯¦æƒ…
     */
    private final Kv detail;
    /**
     * å¯†ç ç­–略修改状态
     */
    private Long strategyUpdateStatus;
    public BladeUserDetails(Long userId, String tenantId, String oauthId, String name, String realName, String deptId, String postId, String roleId, String roleName, String avatar, String username, String password, Kv detail, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection<? extends GrantedAuthority> authorities,Long strategyUpdateStatus) {
        super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
        this.userId = userId;
        this.tenantId = tenantId;
        this.oauthId = oauthId;
        this.name = name;
        this.realName = realName;
        this.account = username;
        this.deptId = deptId;
        this.postId = postId;
        this.roleId = roleId;
        this.roleName = roleName;
        this.avatar = avatar;
        this.detail = detail;
        this.strategyUpdateStatus = strategyUpdateStatus;
    }
    public BladeUserDetails(Long userId, String tenantId, String oauthId, String name, String realName, String deptId, String postId, String roleId, String roleName, String avatar, String username, String password, Kv detail, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection<? extends GrantedAuthority> authorities) {
        super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
Source/BladeX/blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetailsServiceImpl.java
@@ -31,6 +31,7 @@
import org.springblade.core.tool.support.Kv;
import org.springblade.core.tool.utils.*;
import org.springblade.system.cache.ParamCache;
import org.springblade.system.entity.Strategy;
import org.springblade.system.entity.Tenant;
import org.springblade.system.feign.ISysClient;
import org.springblade.system.user.entity.User;
@@ -77,6 +78,7 @@
    private final JwtProperties jwtProperties;
    /**
     * è¶…级管理员信息
     */
@@ -116,16 +118,21 @@
        // æŒ‡å®šç§Ÿæˆ·ID
        String tenantId = StringUtils.isBlank(headerTenant) ? paramTenant : headerTenant;
        Log.debug("当前登录用户的租户Id为:"+tenantId+"当前登录用户名为:"+username);
        Strategy strategy = sysClient.getByTenantIdAndName(tenantId, username).getData();
        // åˆ¤æ–­ç™»å½•是否锁定
        int count = getFailCount(tenantId, username);
        int failCount = Func.toInt(ParamCache.getValue(FAIL_COUNT_VALUE), FAIL_COUNT);
        int failCount = Func.toInt(ParamCache.getValue(FAIL_COUNT_VALUE), Func.toInt(strategy.getLockingNum()));
        if (count >= failCount) {
            throw new UserDeniedAuthorizationException(TokenUtil.USER_HAS_TOO_MANY_FAILS);
        }
        //超级管理员配置文件配置账号密码,实现登录, é»˜è®¤ç§Ÿæˆ·id为000000
        if(tenantId.equals(this.tenantId)){
            if (!this.userName.equals(username) && !password.equalsIgnoreCase(this.password)) {
                setFailCount(tenantId, username, count);
                setFailCount(tenantId, username, count,strategy.getLockingTime());
                throw new UsernameNotFoundException(TokenUtil.USER_NOT_FOUND);
            }
            //如果ip比对后get抛出异常No value present就直接抛异常结束登录
@@ -180,12 +187,13 @@
                User user = userInfo.getUser();
                // ç”¨æˆ·ä¸å­˜åœ¨,但提示用户名与密码错误并锁定账号
                if (user == null || user.getId() == null) {
                    setFailCount(tenantId, username, count);
                    setFailCount(tenantId, username, count,strategy.getLockingTime());
                    throw new UsernameNotFoundException(TokenUtil.USER_NOT_FOUND);
                }
                String hex = DigestUtil.hex(password);
                // ç”¨æˆ·å­˜åœ¨ä½†å¯†ç é”™è¯¯,超过次数则锁定账号
                if (grantType != null && !grantType.equals(TokenUtil.REFRESH_TOKEN_KEY) && !user.getPassword().equals(DigestUtil.hex(password))) {
                    setFailCount(tenantId, username, count);
                if (grantType != null && !grantType.equals(TokenUtil.REFRESH_TOKEN_KEY) && !user.getPassword().equals(hex)) {
                    setFailCount(tenantId, username, count,strategy.getLockingTime());
                    throw new UsernameNotFoundException(TokenUtil.USER_NOT_FOUND);
                }
                // ç”¨æˆ·è§’色不存在
@@ -210,7 +218,7 @@
                BladeUserDetails bladeUserDetails = new BladeUserDetails(user.getId(),
                    user.getTenantId(), StringPool.EMPTY, user.getName(), user.getRealName(), user.getDeptId(), user.getPostId(), user.getRoleId(), Func.join(userInfo.getRoles()), Func.toStr(user.getAvatar(), TokenUtil.DEFAULT_AVATAR),
                    username, AuthConstant.ENCRYPT + user.getPassword(), userInfo.getDetail(), true, true, true, true,
                    AuthorityUtils.commaSeparatedStringToAuthorityList(Func.join(result.getData().getRoles())));
                    AuthorityUtils.commaSeparatedStringToAuthorityList(Func.join(result.getData().getRoles())),user.getStrategyUpdateStatus());
                return bladeUserDetails;
            } else {
                throw new UsernameNotFoundException(result.getMsg());
@@ -279,8 +287,8 @@
     * @param username è´¦å·
     * @param count    æ¬¡æ•°
     */
    private void setFailCount(String tenantId, String username, int count) {
        bladeRedis.setEx(CacheNames.tenantKey(tenantId, CacheNames.USER_FAIL_KEY, username), count + 1, Duration.ofMinutes(30));
    private void setFailCount(String tenantId, String username, int count, Long expir) {
        bladeRedis.setEx(CacheNames.tenantKey(tenantId, CacheNames.USER_FAIL_KEY, username), count + 1, Duration.ofMinutes(expir));
    }
    /**
Source/BladeX/blade-auth/src/main/java/org/springblade/auth/support/BladeJwtTokenEnhancer.java
@@ -64,6 +64,7 @@
        info.put(TokenUtil.AVATAR, principal.getAvatar());
        info.put(TokenUtil.DETAIL, principal.getDetail());
        info.put(TokenUtil.LICENSE, TokenUtil.LICENSE_NAME);
        info.put(TokenUtil.STRATEGYUPDATESTATUS, principal.getStrategyUpdateStatus());
        ((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(info);
        //token状态设置
Source/BladeX/blade-auth/src/main/java/org/springblade/auth/utils/TokenUtil.java
@@ -21,7 +21,6 @@
import org.springblade.core.launch.constant.TokenConstant;
import org.springblade.core.tenant.BladeTenantProperties;
import org.springblade.core.tool.constant.BladeConstant;
import org.springblade.core.tool.jackson.JsonUtil;
import org.springblade.core.tool.utils.*;
import org.springblade.system.entity.Tenant;
import org.springframework.security.authentication.BadCredentialsException;
@@ -30,7 +29,6 @@
import java.util.Base64;
import java.util.Calendar;
import java.util.Date;
/**
 * è®¤è¯å·¥å…·ç±»
@@ -55,6 +53,7 @@
    public final static String DETAIL = TokenConstant.DETAIL;
    public final static String LICENSE = TokenConstant.LICENSE;
    public final static String LICENSE_NAME = TokenConstant.LICENSE_NAME;
    public final static String STRATEGYUPDATESTATUS = "strategyUpdateStatus";
    public final static String DEPT_HEADER_KEY = "Dept-Id";
    public final static String ROLE_HEADER_KEY = "Role-Id";
Source/BladeX/blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java
@@ -40,8 +40,8 @@
    /**
     * nacos dev åœ°å€
     */
    String NACOS_DEV_ADDR = "dev.vci-tech.com:38848";
    //String NACOS_DEV_ADDR = "192.168.93.133:38848";
    //String NACOS_DEV_ADDR = "dev.vci-tech.com:38848";
    String NACOS_DEV_ADDR = "192.168.93.133:38848";
    /**
     * nacos prod åœ°å€
Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Strategy.java
@@ -146,6 +146,12 @@
    private String licensors;
    /**
     * ç»„合方式正则
     */
    @ApiModelProperty(value = "授权人")
    private String regex;
    /**
     * ç»„合名称
     */
    @ApiModelProperty(value = "组合名称")
Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/UserPwdstrategy.java
@@ -1,6 +1,7 @@
package org.springblade.system.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
@@ -26,15 +27,15 @@
@ApiModel(value = "UserPwdStrtategy", description = "UserPwdStrtategy")
public class UserPwdstrategy implements Serializable {
    private static final long serialVersionUID = -556926788101426521L;
    private static final long serialVersionUid = -556926788101426521L;
    /**
     * ä¸»é”®
     */
    @JsonSerialize(using = ToStringSerializer.class)
    @ApiModelProperty(value = "主键")
    @TableId(value = "id", type = IdType.ASSIGN_ID)
    private Long Id;
    @TableId(value = "ID", type = IdType.ASSIGN_ID)
    private Long id;
    /**
     * ç”¨æˆ·id
@@ -46,6 +47,7 @@
     * å¯†ç ç­–ç•¥id
     */
    @ApiModelProperty(value = "密码策略id")
    @TableField(value = "PWDSTRATEGY_ID")
    private Long pwdstrategyId;
    public UserPwdstrategy(Long userId, Long pwdStrategyId) {
@@ -62,11 +64,14 @@
            return false;
        }
        UserPwdstrategy that = (UserPwdstrategy) o;
        return Objects.equals(Id, that.Id) && Objects.equals(userId, that.userId) && Objects.equals(pwdstrategyId, that.pwdstrategyId);
        return Objects.equals(id, that.id) && Objects.equals(userId, that.userId) && Objects.equals(pwdstrategyId, that.pwdstrategyId);
    }
    @Override
    public int hashCode() {
        return Objects.hash(Id, userId, pwdstrategyId);
        return Objects.hash(id, userId, pwdstrategyId);
    }
}
Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClient.java
@@ -21,6 +21,8 @@
import org.springblade.system.entity.*;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
@@ -63,6 +65,9 @@
    String PARAM = API_PREFIX + "/param";
    String PARAM_VALUE = API_PREFIX + "/param-value";
    String REGION = API_PREFIX + "/region";
    String STRATEGY = API_PREFIX + "/query-tenantid-name";
    String STRATEGYBYID = API_PREFIX + "/query-userid";
    String REGEX = API_PREFIX + "/combination-regex";
    /**
     * èŽ·å–èœå•
@@ -285,4 +290,28 @@
    @GetMapping(REGION)
    R<Region> getRegion(@RequestParam("code") String code);
    /**
     * æ ¹æ®ç§Ÿæˆ·id以及用户名获取密码策略
     * @param tenantId
     * @param name
     * @return
     */
    @PostMapping(STRATEGY)
    R<Strategy>  getByTenantIdAndName(@RequestParam("tenantId") String tenantId, @RequestParam("name") String name);
    /**
     * æ ¹æ®ç”¨æˆ·id获取密码策略
     * @param userId
     * @return
     */
    @PostMapping(STRATEGYBYID)
    R<Strategy>  getByUserId(@RequestParam("id") Long userId);
    /**
     * æ ¹æ®ç»„合方式id获取值
     * @return
     */
    @PostMapping(REGEX)
    R<String> getRegex(@RequestBody List<String> combinationIds);
}
Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClientFallback.java
@@ -150,5 +150,20 @@
        return R.fail("获取数据失败");
    }
    @Override
    public R<Strategy> getByTenantIdAndName(String tenantId, String name) {
        return R.fail("获取数据失败");
    }
    @Override
    public R<Strategy> getByUserId(Long userId) {
        return R.fail("获取数据失败");
    }
    @Override
    public R<String> getRegex(List<String> combinationIds) {
        return R.fail("获取数据失败");
    }
}
Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/UserPwdstrategyVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package org.springblade.system.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.system.entity.UserPwdstrategy;
import java.util.List;
/**
 * (UserPwdStrtategy)实体类
 *
 * @author makejava
 * @since 2023-03-20 14:59:29
 */
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "TenantVO对象", description = "TenantVO对象")
public class UserPwdstrategyVO extends UserPwdstrategy {
    private static final long serialVersionUID = 336389756425054417L;
    @ApiModelProperty(value = "需要修改或者新增密码策略的用户id")
    private List<Long> userIds;
}
Source/BladeX/blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/entity/User.java
@@ -52,11 +52,6 @@
     * å¯†ç 
     */
    private String password;
    @TableField(exist = false)
    /**
     * å¯†ç ç­–ç•¥
     */
    private String pwdStrategy;
    /**
     * æ˜µç§°
     */
@@ -94,8 +89,25 @@
     */
    private String deptId;
    /**
     * å¯†ç ç­–ç•¥
     */
    @TableField(exist = false)
    private String pwdStrategy;
    /**
     * å²—位id
     */
    private String postId;
    /**
     * å¯†ç ä¿®æ”¹æ—¶é—´
     */
    private Date pwdUpdateTime;
    /**
     * ç”¨æˆ·å¯†çº§
     */
    private String secretgrade;
    /**
     * å¯†ç ç­–略修改状态
     */
    private Long strategyUpdateStatus;
}
Source/BladeX/blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java
@@ -49,6 +49,7 @@
    String SAVE_USER = API_PREFIX + "/save-user";
    String SAVE_USER_LIST = API_PREFIX + "/save-user-list";
    String REMOVE_USER = API_PREFIX + "/remove-user";
    String UPDATE_USER = API_PREFIX+"/update-user";
    /**
     * èŽ·å–ç”¨æˆ·ä¿¡æ¯
@@ -58,7 +59,6 @@
     */
    @GetMapping(USER_INFO_BY_ID)
    R<User> userInfoById(@RequestParam("userId") Long userId);
    /**
     * æ ¹æ®è´¦å·èŽ·å–ç”¨æˆ·ä¿¡æ¯
@@ -126,4 +126,12 @@
    @PostMapping(REMOVE_USER)
    R<Boolean> removeUser(@RequestParam("tenantIds") String tenantIds);
    /**
     * ä¿®æ”¹ç”¨æˆ·åŸºç¡€ä¿¡æ¯
     * @param user
     * @return
     */
    @PostMapping(UPDATE_USER)
    R<Boolean> updateUser(@RequestBody User user);
}
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/controller/StrategyController.java
@@ -20,7 +20,7 @@
import java.util.List;
/**
 * å¯†ç ç­–ç•¥(PlSysStrategy)表控制层
 * å¯†ç ç­–ç•¥(Strategy)表控制层
 *
 * @author makejava
 * @since 2023-03-20 16:45:31
@@ -47,10 +47,23 @@
     */
    @GetMapping("/page")
    @ApiOperationSupport(order = 1)
    @ApiOperation(value = "分页查询", notes = "传入combination,分页参数query")
    @ApiOperation(value = "分页查询", notes = "传入分页参数query")
    public R<Page<Strategy>> queryByPage(Query query) {
        Page<Strategy> strategyPage = strategyService.queryAllByPage(query);
        return R.data(strategyPage);
    }
    /**
     * æŸ¥è¯¢é»˜è®¤å¯†ç ç­–ç•¥
     *
     * @return æŸ¥è¯¢ç»“æžœ
     */
    @GetMapping("/default")
    @ApiOperationSupport(order = 1)
    @ApiOperation(value = "查询默认密码策略")
    public R<Strategy> queryByIsDefault() {
        Strategy strategy = strategyService.queryByIsDefault();
        return R.data(strategy);
    }
    /**
@@ -92,5 +105,18 @@
        return ResponseEntity.ok(this.strategyService.deleteByIds(ids));
    }
    /**
     * æ ¹æ®ç”¨æˆ·id查询密码策略
     *
     * @param userId å®žä½“
     * @return æ–°å¢žç»“æžœ
     */
    @PostMapping("/query-userid")
    @ApiOperationSupport(order = 5)
    @ApiOperation(value = "根据用户id查询密码策略", notes = "传入userId")
    public R<Strategy> queryByUserId(@Valid @RequestParam Long userId) {
        return R.data(this.strategyService.queryByUserId(userId));
    }
}
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/controller/UserPwdstrategyController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
package org.springblade.system.controller;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.system.service.IUserPwdstrategyService;
import org.springblade.system.vo.UserPwdstrategyVO;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import javax.annotation.Resource;
import javax.validation.Valid;
/**
 * ç”¨æˆ·å¯†ç ç­–略关联(UserPwdstrategy)表控制层
 *
 * @author ludc
 * @since 2023-03-20 15:23:24
 */
@NonDS
@ApiIgnore
@AllArgsConstructor
@RestController
@RequestMapping("/user-pwdstrategy")
@Api(value = "用户密码安全策略关联表", tags = "接口")
public class UserPwdstrategyController {
    @Resource
    private IUserPwdstrategyService userPwdstrategyService;
    /**
     * æ–°å¢žå’Œä¿®æ”¹æ•°æ®
     *
     * @param userPwdstrategyVO å®žä½“
     * @return æ–°å¢žç»“æžœ
     */
    @PutMapping("/insert")
    @ApiOperationSupport(order = 3)
    @ApiOperation(value = "新增数据", notes = "传入userPwdstrategy")
    public ResponseEntity<Boolean> insert(@Valid @RequestBody UserPwdstrategyVO userPwdstrategyVO) {
        return ResponseEntity.ok(this.userPwdstrategyService.submit(userPwdstrategyVO));
    }
    /**
     * æ–°å¢žå’Œä¿®æ”¹æ•°æ®
     *
     * @param userPwdstrategyVO å®žä½“
     * @return æ–°å¢žç»“æžœ
     */
    @PostMapping("/update")
    @ApiOperationSupport(order = 3)
    @ApiOperation(value = "修改数据", notes = "传入userPwdstrategy")
    public ResponseEntity<Boolean> update(@Valid @RequestBody UserPwdstrategyVO userPwdstrategyVO) {
        return ResponseEntity.ok(this.userPwdstrategyService.submit(userPwdstrategyVO));
    }
}
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/controller/ValueRangeController.java
@@ -21,9 +21,9 @@
import java.util.List;
/**
 * (ValueRange)表控制层
 * (ValueRangeController)表控制层
 *
 * @author makejava
 * @author ludc
 * @since 2023-03-20 15:23:24
 */
@NonDS
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/feign/SysClient.java
@@ -22,6 +22,8 @@
import org.springblade.system.entity.*;
import org.springblade.system.service.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.annotations.ApiIgnore;
@@ -53,6 +55,10 @@
    private final IParamService paramService;
    private final IRegionService regionService;
    private final IStrategyService strategyService;
    private final ICombinationService combinationService;
    @Override
    @GetMapping(MENU)
@@ -191,5 +197,23 @@
        return R.data(regionService.getById(code));
    }
    @Override
    @PostMapping(STRATEGY)
    public R<Strategy> getByTenantIdAndName(String tenantId, String name) {
        return R.data(strategyService.queryByNameAndTenantId(tenantId,name));
    }
    @Override
    @PostMapping(STRATEGYBYID)
    public R<Strategy> getByUserId(Long userId) {
        return R.data(strategyService.queryByUserId(userId));
    }
    @Override
    @PostMapping(REGEX)
    public R<String> getRegex(@RequestBody List<String> combinationIds) {
        return R.data(combinationService.getRegex(combinationIds));
    }
}
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/CombinationMapper.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
import org.springblade.system.entity.Combination;
import java.util.List;
@@ -38,5 +39,13 @@
     */
    long count(Combination combination);
    /**
     * æŸ¥è¯¢ç»„合方式正则
     *
     * @param combinationIds æŸ¥è¯¢æ¡ä»¶
     * @return æ€»è¡Œæ•°
     */
    String queryRegex(@Param("combinationIds") List<String> combinationIds);
}
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/CombinationMapper.xml
@@ -6,10 +6,10 @@
        <result property="id" column="ID" jdbcType="VARCHAR"/>
        <result property="name" column="NAME" jdbcType="VARCHAR"/>
        <result property="desc" column="DESC" jdbcType="VARCHAR"/>
        <result property="createtime" column="CREATETIME" jdbcType="TIMESTAMP"/>
        <result property="createuser" column="CREATEUSER" jdbcType="VARCHAR"/>
        <result property="updatetime" column="UPDATETIME" jdbcType="TIMESTAMP"/>
        <result property="updateuser" column="UPDATEUSER" jdbcType="VARCHAR"/>
        <result property="createTime" column="CREATETIME" jdbcType="TIMESTAMP"/>
        <result property="createUser" column="CREATEUSER" jdbcType="VARCHAR"/>
        <result property="updateTime" column="UPDATETIME" jdbcType="TIMESTAMP"/>
        <result property="updateUser" column="UPDATEUSER" jdbcType="VARCHAR"/>
        <result property="licensors" column="LICENSORS" jdbcType="VARCHAR"/>
    </resultMap>
@@ -87,5 +87,14 @@
        limit #{pageable.offset}, #{pageable.pageSize}
    </select>
    <select id="queryRegex" resultType="java.lang.String">
        SELECT REPLACE(WM_CONCAT(psc.REGEX),',[','[') from PL_SYS_COMBINATION psc
        WHERE psc.ID IN (
        <foreach collection="combinationIds" item="id" separator=",">
            #{id}
        </foreach>
        )
    </select>
</mapper>
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/StrategyMapper.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
import org.springblade.system.entity.Strategy;
import java.util.List;
@@ -31,5 +32,19 @@
     */
    long count(Strategy plSysStrategy);
    /**
     * æ ¹æ®ç”¨æˆ·åä»¥åŠç§Ÿæˆ·ID查询密码策略
     * @return
     */
    Strategy queryByNameAndTenantId(@Param("tenantId") String tenantId,@Param("name") String name);
    /**
     * æ ¹æ®ç”¨æˆ·id进行查询
     *
     * @param userId ç”¨æˆ·id
     * @return å¯¹è±¡
     */
    Strategy queryByUserId(@Param("userId") Long userId);
}
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/StrategyMapper.xml
@@ -7,7 +7,7 @@
        <result property="strategyName" column="STRATEGY_NAME" jdbcType="VARCHAR"/>
        <result property="minPwdLen" column="MIN_PWD_LEN" jdbcType="VARCHAR"/>
        <result property="maxPwdLen" column="MAX_PWD_LEN" jdbcType="VARCHAR"/>
        <result property="combinationIds" column="COMBINATION " jdbcType="VARCHAR"/>
        <result property="combinationIds" column="COMBINATION_IDS" jdbcType="VARCHAR"/>
        <result property="requiredType" column="REQUIRED_TYPE" jdbcType="VARCHAR"/>
        <result property="expirationTime" column="EXPIRATION_TIME" jdbcType="TIMESTAMP"/>
        <result property="reminderTime" column="REMINDER_TIME" jdbcType="TIMESTAMP"/>
@@ -20,6 +20,7 @@
        <result property="updateTime" column="UPDATE_TIME" jdbcType="TIMESTAMP"/>
        <result property="updateUser" column="UPDATE_USER" jdbcType="TIMESTAMP"/>
        <result property="combinationNames" column="COMBINATIONNAMES"/>
        <result property="regex" column="REGEX"/>
    </resultMap>
    <!--查询指定行数据-->
@@ -87,63 +88,18 @@
        </where>
    </select>
    <!--通过主键修改数据-->
    <!--<update id="update">
        update PL_SYS_STRATEGY
        <set>
            <if test="strategyName != null and strategyName != ''">
                STRATEGY_NAME = #{strategyName},
            </if>
            <if test="minPwdLen != null and minPwdLen != ''">
                MIN_PWD_LEN = #{minPwdLen},
            </if>
            <if test="maxPwdLen != null and maxPwdLen != ''">
                MAX_PWD_LEN = #{maxPwdLen},
            </if>
            <if test="combination  != null and combination  != ''">
                COMBINATION  = #{combination },
            </if>
            <if test="requiredType != null and requiredType != ''">
                REQUIRED_TYPE = #{requiredType},
            </if>
            <if test="expirationTime != null">
                EXPIRATION_TIME = #{expirationTime},
            </if>
            <if test="reminderTime != null">
                REMINDER_TIME = #{reminderTime},
            </if>
            <if test="lockingNum != null and lockingNum != ''">
                LOCKING_NUM = #{lockingNum},
            </if>
            <if test="lockingTime != null">
                LOCKING_TIME = #{lockingTime},
            </if>
            <if test="desc != null and desc != ''">
                DESC = #{desc},
            </if>
            <if test="isDefault != null and isDefault != ''">
                IS_DEFAULT = #{isDefault},
            </if>
            <if test="createDate != null">
                CREATE_DATE = #{createDate},
            </if>
            <if test="createUser != null">
                CREATE_USER = #{createUser},
            </if>
            <if test="updateDate != null">
                UPDATE_DATE = #{updateDate},
            </if>
            <if test="updateUser != null">
                UPDATE_USER = #{updateUser},
            </if>
        </set>
        where ID = #{id}
    </update>
    &lt;!&ndash;通过主键删除&ndash;&gt;
    <delete id="deleteById">
        delete from PL_SYS_STRATEGY where ID = #{id}
    </delete>-->
    <select id="queryByNameAndTenantId" resultMap="StrategyMap">
        SELECT PSS.* FROM PL_SYS_STRATEGY PSS
              LEFT JOIN PL_SYS_USER_PWDSTRATEGY PSUP ON PSS.ID=PSUP.PWDSTRATEGY_ID
              LEFT JOIN PL_ORG_USER POU ON POU.ID=PSUP.USER_ID
        WHERE POU.TENANT_ID = #{tenantId} AND POU.NAME=#{name};
    </select>
    <select id="queryByUserId" resultMap="StrategyMap">
        SELECT PSS.* FROM PL_SYS_STRATEGY PSS LEFT JOIN PL_SYS_USER_PWDSTRATEGY PSUP ON PSS.ID=psup.PWDSTRATEGY_ID
        WHERE PSUP.USER_ID = #{userId}
    </select>
</mapper>
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/UserPwdstrategyMapper.java
@@ -3,6 +3,8 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springblade.system.entity.UserPwdstrategy;
import java.util.List;
/**
 * ç”¨æˆ·å¯†ç ç­–略管理表(UserPwdstrategy)表数据库访问层
 *
@@ -20,14 +22,6 @@
    UserPwdstrategy queryById(Long id);
    /**
     * ç»Ÿè®¡æ€»è¡Œæ•°
     *
     * @param UserPwdstrategy æŸ¥è¯¢æ¡ä»¶
     * @return æ€»è¡Œæ•°
     */
    long count(UserPwdstrategy UserPwdstrategy);
    /**
     * ä¿®æ”¹æ•°æ®
     *
     * @param UserPwdstrategy å®žä¾‹å¯¹è±¡
@@ -36,12 +30,12 @@
    int update(UserPwdstrategy UserPwdstrategy);
    /**
     * é€šè¿‡ä¸»é”®åˆ é™¤æ•°æ®
     * é€šè¿‡ç”¨æˆ·id进行删除数据
     *
     * @param id ä¸»é”®
     * @param userIds ç”¨æˆ·id
     * @return å½±å“è¡Œæ•°
     */
    int deleteById(Long id);
    int deleteByUserIds(List<Long> userIds);
}
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/UserPwdstrategyMapper.xml
@@ -48,11 +48,12 @@
        where ID = #{id}
    </update>
    <!--通过主键删除-->
    <delete id="deleteById">
        delete
        from PL_SYS_USER_PWDSTRATEGY
        where ID = #{id}
    <delete id="deleteByUserIds">
        DELETE FROM PL_SYS_USER_PWDSTRATEGY WHERE USER_ID IN (
        <foreach collection="userIds" item="uId" separator=",">
            #{uId}
        </foreach>
        )
    </delete>
</mapper>
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/ValueRangeMapper.java
@@ -32,5 +32,12 @@
     */
    long count(ValueRange valueRannge);
    /**
     * æ ¹ç©¶ç»„合id查询取值
     * @return
     */
    List<String> queryByCombinationIds(@Param("combinationIds") List<String> combinationIds);
}
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/ValueRangeMapper.xml
@@ -6,10 +6,10 @@
        <result property="id" column="ID" jdbcType="VARCHAR"/>
        <result property="value" column="VALUE" jdbcType="VARCHAR"/>
        <result property="combinationId" column="COMBINATION_ID" jdbcType="VARCHAR"/>
        <result property="createuser" column="CREATEUSER" jdbcType="VARCHAR"/>
        <result property="updatetime" column="UPDATETIME" jdbcType="TIMESTAMP"/>
        <result property="updateuser" column="UPDATEUSER" jdbcType="VARCHAR"/>
        <result property="createtime" column="CREATETIME" jdbcType="TIMESTAMP"/>
        <result property="updateTime" column="CREATEUSER" jdbcType="VARCHAR"/>
        <result property="updateTime" column="UPDATETIME" jdbcType="TIMESTAMP"/>
        <result property="createUser" column="UPDATEUSER" jdbcType="VARCHAR"/>
        <result property="createTime" column="CREATETIME" jdbcType="TIMESTAMP"/>
    </resultMap>
    <!--查询指定行数据-->
@@ -72,5 +72,14 @@
        </where>
    </select>
    <select id="queryByCombinationIds" resultType="java.util.List">
        SELECT "VALUE" FROM PL_SYS_VALUE_RANGE PSVR
        WHERE PSVR.COMBINATION_ID IN (
            <foreach collection="combinationIds" item="id" separator=",">
                #{id}
            </foreach>
        )
    </select>
</mapper>
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/ICombinationService.java
@@ -55,4 +55,11 @@
     */
    List<Map<String,Object>> selectMaps();
    /**
     * ä¸‹æ‹‰æ•°æ®æºæŸ¥è¯¢
     * æŸ¥è¯¢ç»„合id(key):组合名(value)
     * @return
     */
    String getRegex(List<String> combinationIds);
}
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/IStrategyService.java
@@ -24,6 +24,13 @@
    Strategy queryById(String id);
    /**
     * æŸ¥è¯¢é»˜è®¤å¯†ç ç­–ç•¥
     *
     * @return å®žä¾‹å¯¹è±¡
     */
    Strategy queryByIsDefault();
    /**
     * åˆ†é¡µæŸ¥è¯¢
     *
     * @param query åˆ†é¡µå¯¹è±¡
@@ -48,9 +55,18 @@
    boolean deleteByIds(List<String> ids);
    /**
     * æŸ¥è¯¢é»˜è®¤å¯†ç ç­–ç•¥
     * é€šè¿‡ç§Ÿæˆ·id以及用户名查询密码策略
     * @param tenantId
     * @param name
     * @return
     */
    Long queryByIsDefault();
    Strategy queryByNameAndTenantId(String tenantId, String name);
    /**
     * æ ¹æ®ç”¨æˆ·id查询密码策略
     * @param userId
     * @return
     */
    Strategy queryByUserId(Long userId);
}
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/IUserPwdstrategyService.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.extension.service.IService;
import org.springblade.system.entity.UserPwdstrategy;
import org.springblade.system.vo.UserPwdstrategyVO;
/**
 * ç”¨æˆ·å¯†ç ç­–略管理表(UserPwdstrategy)表服务接口
@@ -12,11 +13,22 @@
public interface IUserPwdstrategyService extends IService<UserPwdstrategy> {
    /**
     * æ–°å¢žæˆ–修改数据
     * é€šè¿‡ID查询单条数据
     *
     * @param UserPwdstrategy å®žä¾‹å¯¹è±¡
     * @param id ä¸»é”®
     * @return å®žä¾‹å¯¹è±¡
     */
    boolean submit(UserPwdstrategy UserPwdstrategy);
    UserPwdstrategy queryById(Long id);
    /**
     * æ–°å¢žæˆ–修改数据
     *
     * @param userPwdstrategyVO å®žä¾‹å¯¹è±¡
     * @return å®žä¾‹å¯¹è±¡
     */
    Boolean submit(UserPwdstrategyVO userPwdstrategyVO);
}
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/IValueRangeService.java
@@ -46,4 +46,11 @@
     */
    boolean deleteByIds(List<String> ids);
    /**
     * èŽ·å–å–å€¼
     *
     * @return æ˜¯å¦æˆåŠŸ
     */
    List<String> getByAllString(List<String> combinationIds);
}
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/CombinationServiceImpl.java
@@ -114,4 +114,9 @@
        return maps;
    }
    @Override
    public String getRegex(List<String> combinationIds) {
        return combinationMapper.queryRegex(combinationIds);
    }
}
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/StrategyServiceImpl.java
@@ -44,6 +44,16 @@
    }
    /**
     * æŸ¥è¯¢é»˜è®¤å¯†ç ç­–ç•¥
     * @return
     */
    @Override
    public Strategy queryByIsDefault() {
        return this.getOne(Wrappers.<Strategy>query().lambda()
            .eq(Strategy::getIsDefault, CommonConstant.DATA_SCOPE_CATEGORY));
    }
    /**
     * åˆ†é¡µæŸ¥è¯¢
     *
     * @param query åˆ†é¡µå¯¹è±¡
@@ -77,6 +87,18 @@
                this.update(Wrappers.<Strategy>update().lambda()
                    .set(Strategy::getIsDefault, CommonConstant.NOT_SEALED_ID)
                    .eq(Strategy::getIsDefault, CommonConstant.DATA_SCOPE_CATEGORY));
            }
            if(strategy.getRequiredType() > 0){
                throw new ServiceException("必填种类不能小于等于0!");
            }
            if(strategy.getRequiredType() > strategy.getCombinationIds().split(",").length){
                throw new ServiceException("必填种类不能大于所选择的密码组合方式的个数!");
            }
            if(strategy.getMaxPwdLen() > strategy.getMinPwdLen()){
                throw new ServiceException("密码最大长度不能小于最小长度!");
            }
            if(strategy.getMinPwdLen() < strategy.getCombinationIds().split(",").length || strategy.getMaxPwdLen() < strategy.getCombinationIds().split(",").length){
                throw new ServiceException("密码最小长度不能小于秘密策略的值!");
            }
            if(Func.isEmpty(strategy.getCreateTime())){
                strategy.setCreateTime(new Date());
@@ -125,13 +147,32 @@
    }
    /**
     * æŸ¥è¯¢é»˜è®¤å¯†ç ç­–ç•¥
     * é€šè¿‡ç§Ÿæˆ·id以及用户名查询密码策略
     * @param tenantId
     * @param name
     * @return
     */
    @Override
    public Long queryByIsDefault() {
        return this.getOne(Wrappers.<Strategy>query().lambda()
            .eq(Strategy::getIsDefault, CommonConstant.DATA_SCOPE_CATEGORY)).getId();
    public Strategy queryByNameAndTenantId(String tenantId, String name) {
        Strategy strategy = this.strategyMapper.queryByNameAndTenantId(tenantId,name);
        if(!Func.isEmpty(strategy)){
            return strategy;
        }
        return queryByIsDefault();
    }
    /**
     * æ ¹æ®ç”¨æˆ·id查询密码策略
     * @param userId
     * @return
     */
    @Override
    public Strategy queryByUserId(Long userId) {
        Strategy strategy = this.strategyMapper.queryByUserId(userId);
        if(!Func.isEmpty(strategy)){
            return strategy;
        }
        return queryByIsDefault();
    }
}
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/TenantServiceImpl.java
@@ -21,6 +21,7 @@
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springblade.common.constant.CommonConstant;
import org.springblade.core.cache.utils.CacheUtil;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.base.BaseServiceImpl;
@@ -231,6 +232,7 @@
        user.setName(role.getRoleAlias());
        user.setRealName(role.getRoleName());
        user.setAccount(role.getRoleAlias());
        user.setStrategyUpdateStatus(CommonConstant.TOP_PARENT_ID);
        // èŽ·å–å‚æ•°é…ç½®çš„å¯†ç 
        String password = Func.toStr(ParamCache.getValue(PASSWORD_KEY), DEFAULT_PASSWORD);
        user.setPassword(password);
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/UserPwdstrategyServiceImpl.java
@@ -1,16 +1,20 @@
package org.springblade.system.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springblade.core.cache.utils.CacheUtil;
import org.springblade.core.tool.utils.Func;
import lombok.RequiredArgsConstructor;
import org.springblade.common.constant.CommonConstant;
import org.springblade.system.entity.UserPwdstrategy;
import org.springblade.system.mapper.UserPwdstrategyMapper;
import org.springblade.system.service.IUserPwdstrategyService;
import org.springblade.system.user.entity.User;
import org.springblade.system.user.feign.IUserClient;
import org.springblade.system.vo.UserPwdstrategyVO;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE;
import java.util.ArrayList;
import java.util.List;
/**
 * ç”¨æˆ·å¯†ç ç­–略管理表(UserPwdstrategy)表服务实现类
@@ -19,25 +23,45 @@
 * @since 2023-03-22 15:24:55
 */
@Service
@RequiredArgsConstructor
public class UserPwdstrategyServiceImpl extends ServiceImpl<UserPwdstrategyMapper,UserPwdstrategy> implements IUserPwdstrategyService {
    @Resource
    private UserPwdstrategyMapper userPwdstrategyMapper;
    /**
     * æ–°å¢žæ•°æ®
     *
     * @param userPwdstrategy å®žä¾‹å¯¹è±¡
     * @return å®žä¾‹å¯¹è±¡
     * user服务调用类
     */
    private final IUserClient userClient;
    @Override
    public UserPwdstrategy queryById(Long id) {
        return this.getById(id);
    }
    /**
     * æ–°å¢žæˆ–修改
     * @param userPwdstrategyVO å®žä¾‹å¯¹è±¡
     * @return
     */
    @Override
    public boolean submit(UserPwdstrategy userPwdstrategy) {
        if(Func.isEmpty(userPwdstrategy.getId())){
            return this.saveOrUpdate(userPwdstrategy);
        }else {
            CacheUtil.clear(SYS_CACHE,Boolean.FALSE);
            return this.saveOrUpdate(userPwdstrategy);
        }
    @Transactional(rollbackFor = Exception.class)
    public Boolean submit(UserPwdstrategyVO userPwdstrategyVO) {
        //先删除
        int eft = this.userPwdstrategyMapper.deleteByUserIds(userPwdstrategyVO.getUserIds());
        //在新增
        List<UserPwdstrategy> userPwdstrategyList = new ArrayList<>();
        userPwdstrategyVO.getUserIds().forEach(id->{
            boolean temp = userPwdstrategyList.add(new UserPwdstrategy(id, userPwdstrategyVO.getPwdstrategyId()));
            if(temp){
                //密码策略改动成功之后修改用户状态
                User user = new User();
                user.setId(id);
                user.setStrategyUpdateStatus(CommonConstant.TOP_PARENT_ID);
                userClient.updateUser(user);
            }
        });
        return this.saveBatch(userPwdstrategyList);
    }
}
Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/ValueRangeServiceImpl.java
@@ -101,4 +101,15 @@
        return tenantTemp;
    }
    /**
     * èŽ·å–å–å€¼
     *
     * @return æ˜¯å¦æˆåŠŸ
     */
    @Override
    public List<String> getByAllString(List<String> combinationIds) {
        List<String> list = valueRangeMapper.queryByCombinationIds(combinationIds);
        return list;
    }
}
Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/controller/UserController.java
@@ -33,12 +33,10 @@
import org.springblade.core.mp.support.Query;
import org.springblade.core.redis.cache.BladeRedis;
import org.springblade.core.secure.BladeUser;
import org.springblade.core.secure.annotation.PreAuth;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.constant.BladeConstant;
import org.springblade.core.tool.constant.RoleConstant;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.StringPool;
@@ -317,7 +315,6 @@
        return R.data(userService.selectUserSearch(user, query));
    }
    /**
     * ç”¨æˆ·è§£é”
     */
@@ -333,4 +330,15 @@
        return R.success("操作成功");
    }
    /**
     * ç”¨æˆ·è§£é”
     */
    @PostMapping("/check-renexpr")
    @ApiOperationSupport(order = 19)
    @ApiOperation(value = "查询用户密码策略是否需要提醒", notes = "传入id")
    public R<Long> checkRenAndExpr(@RequestParam Long userId) {
        Long res = userService.checkRenAndExpr(userId);
        return R.data(res);
    }
}
Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/feign/UserClient.java
@@ -93,4 +93,10 @@
        return R.data(service.remove(Wrappers.<User>query().lambda().in(User::getTenantId, Func.toStrList(tenantIds))));
    }
    @Override
    @PostMapping(UPDATE_USER)
    public R<Boolean> updateUser(@RequestBody User user) {
        return R.data(service.updateUser(user));
    }
}
Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/mapper/UserMapper.xml
@@ -16,7 +16,6 @@
        <result column="user_type" property="userType"/>
        <result column="account" property="account"/>
        <result column="password" property="password"/>
        <result column="strategy_name" property="pwdStrategy"/>
        <result column="name" property="name"/>
        <result column="real_name" property="realName"/>
        <result column="email" property="email"/>
@@ -26,10 +25,16 @@
        <result column="role_id" property="roleId"/>
        <result column="dept_id" property="deptId"/>
        <result column="post_id" property="postId"/>
        <result column="strategy_name" property="pwdStrategy"/>
        <result column="pwd_update_time" property="pwdUpdateTime"/>
        <result column="secretgrade" property="secretgrade"/>
        <result column="strategy_update_status" property="strategyUpdateStatus"/>
    </resultMap>
    <select id="selectUserPage" resultMap="userResultMap">
        SELECT pou.id, pou.tenant_id, user_type, account, name, real_name, email, phone, birthday,role_id, dept_id, post_id,nvl(pss.STRATEGY_NAME,(SELECT STRATEGY_NAME FROM PL_SYS_STRATEGY WHERE IS_DEFAULT=1)) strategy_name
        SELECT
            pou.*,nvl(pss.STRATEGY_NAME,(SELECT STRATEGY_NAME FROM PL_SYS_STRATEGY WHERE IS_DEFAULT=1)) strategy_name
        FROM pl_org_user pou
            LEFT JOIN PL_SYS_USER_PWDSTRATEGY plup on plup.USER_ID=pou.ID
            LEFT JOIN PL_SYS_STRATEGY pss on pss.ID=plup.PWDSTRATEGY_ID
@@ -66,7 +71,8 @@
    </select>
    <select id="getUser" resultMap="userResultMap">
        SELECT pou.id, tenant_id, user_type, account, name, real_name, email, phone, birthday,role_id, dept_id, post_id,nvl(pss.STRATEGY_NAME,(SELECT STRATEGY_NAME FROM PL_SYS_STRATEGY WHERE IS_DEFAULT=1)) strategy_name
        SELECT
            pou.*,nvl(pss.STRATEGY_NAME,(SELECT STRATEGY_NAME FROM PL_SYS_STRATEGY WHERE IS_DEFAULT=1)) strategy_name
        FROM pl_org_user pou
            LEFT JOIN PL_SYS_USER_PWDSTRATEGY plup on plup.USER_ID=pou.ID
            LEFT JOIN PL_SYS_STRATEGY pss on pss.ID=plup.PWDSTRATEGY_ID
@@ -75,7 +81,8 @@
    </select>
    <select id="exportUser" resultType="org.springblade.system.user.excel.UserExcel">
        SELECT pou.id, tenant_id, user_type, account, name, real_name, email, phone, birthday,role_id, dept_id, post_id,nvl(pss.STRATEGY_NAME,(SELECT STRATEGY_NAME FROM PL_SYS_STRATEGY WHERE IS_DEFAULT=1)) strategy_name
        SELECT
            pou.*,nvl(pss.STRATEGY_NAME,(SELECT STRATEGY_NAME FROM PL_SYS_STRATEGY WHERE IS_DEFAULT=1)) strategy_name
        FROM pl_org_user pou
            LEFT JOIN PL_SYS_USER_PWDSTRATEGY plup on plup.USER_ID=pou.ID
            LEFT JOIN PL_SYS_STRATEGY pss on pss.ID=plup.PWDSTRATEGY_ID
Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/service/IUserService.java
@@ -213,4 +213,11 @@
     * @return
     */
    UserVO platformDetail(User user);
    /**
     * æ£€æŸ¥ç”¨æˆ·æ˜¯å¦åˆ°äº†æé†’用户修改密码或者密码过期的时间
     *
     */
    Long checkRenAndExpr(Long userId);
}
Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java
@@ -36,6 +36,7 @@
import org.springblade.system.cache.DictCache;
import org.springblade.system.cache.ParamCache;
import org.springblade.system.cache.SysCache;
import org.springblade.system.entity.Strategy;
import org.springblade.system.entity.Tenant;
import org.springblade.system.enums.DictEnum;
import org.springblade.system.feign.ISysClient;
@@ -51,11 +52,9 @@
import org.springblade.system.user.wrapper.UserWrapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.*;
import static org.springblade.common.constant.CommonConstant.DEFAULT_PARAM_PASSWORD;
@@ -294,6 +293,7 @@
    @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("请输入正确的确认密码!");
@@ -301,7 +301,21 @@
        if (!user.getPassword().equals(DigestUtil.hex(oldPassword))) {
            throw new ServiceException("原密码不正确!");
        }
        return this.update(Wrappers.<User>update().lambda().set(User::getPassword, DigestUtil.hex(newPassword)).eq(User::getId, userId));
        //获取用户采用的密码策略
        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(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;
    }
    @Override
@@ -438,4 +452,38 @@
        return userVO;
    }
    @Override
    public Long checkRenAndExpr(Long userId) {
        //获取到密码修改时间
        Date pwdUpdateTime = this.getOne(Wrappers.<User>query().eq("ID", userId)).getPwdUpdateTime();
        Long pwdupdateday = 0L;
        if(!Func.isEmpty(pwdUpdateTime)){
            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;
        }
        //提醒用户还有多久过期
        if(reminder<=strategy.getReminderTime()){
            long res = (strategy.getReminderTime()+pwdupdateday)-dateToDay(new Date());
            return res;
        }
        //代表正常状态还未到提醒与过期时间,既不提醒也不要求修改
        return 0L;
    }
    private Long dateToDay(Date date){
        long time = date.getTime();
        return time/(1000 * 60 * 60 * 24);
    }
}