登录系统后校验弱密码示例(前端可以自定义校验规则)

//前端自定义规则校验(前端页面增加缓存window.sessionStorage机制)

规则组成:

1、checkRuleStr:弱密码组成字符串,多个使用英文逗号,隔开

2、checkDateStartStr:可传入校验指定日期之后的日期字符串, 例如 校验“2021-06-30 00:00:00”之后注册的账号;不传则默认校验全部账号

3、checkDateEndStr:校验指定日期之前的账号 例如 校验“2021-07-30 00:00:00”之前注册的账号;不传则默认校验全部账号

4、增加window.sessionStorage缓存机制,同一个页面下不进行多次提示,增强用户体验度

注意:window.sessionStorage和window.localStorage 区别

(1)只要浏览器保持打开状态, sessionStorage 就会持续存在,(即同一个浏览器窗口下,即使点击刷新后依旧存在)

(2)localStorage 在浏览器重新启动后仍然存在,持久性适用于整个网站不只是它的一个页面。

前端JS示例:

/**
	 *  登录后校验弱密码
	 * @param passwordStr        旧密码加密串
	 * @param customerId         客户编号
	 * @param checkRuleStr       校验字符规则 例如 校验“123456,12345678”这种初始弱密码(多个使用英文逗号拼接),不传默认校验 123456 弱密码
	 * @param checkDateStartStr       校验指定日期之后的账号 例如 校验“2021-06-30 00:00:00”之后注册的账号;不传则默认校验全部账号
	 * @param checkDateEndStr         校验指定日期之前的账号 例如 校验“2021-07-30 00:00:00”之前注册的账号;不传则默认校验全部账号
	 */
	function checkWeakPwd(checkRuleStr,checkDateStartStr,checkDateEndStr) {
			var passwordStr = "${password}";        //当前密码加密串
			var customerId = "${customerId}";       //客户编号
			var displayName = "${displayName}";     //当前用户名
			var isNeedCheckPwdAgainFlag = window.sessionStorage.getItem('isNeedCheckPwdAgainFlag');  //获取缓存数据
			if(!isNeedCheckPwdAgainFlag || isNeedCheckPwdAgainFlag != displayName){
				if (passwordStr) {
					var url = 'user/checkWeakPwd';
					/*if(!checkDateStartStr) {
						checkDateStartStr = "2021-06-30 00:00:00";   //校验此日期之后的注册的用户是否存在弱密码
					}*/
					var paramData = {
						passwordStr: passwordStr,
						customerId: customerId,
						checkRuleStr: checkRuleStr,
						checkDateStartStr: checkDateStartStr,
						checkDateEndStr: checkDateEndStr,
					}
					console.log(passwordStr);
					$.ajax({
						url: url,    //请求的url地址
						contentType: 'application/json',
						dataType: "json",   //返回格式为json
						async: true,//请求是否异步,默认为异步,这也是ajax重要特性
						data: JSON.stringify(paramData),    //参数值
						type: "POST",   //请求方式
						beforeSend: function () {
							//请求前的处理
						},
						success: function (req) {
							//请求成功时处理
							if (req.code == '0') {
								layer.confirm(req.msg, {btn: ["确定修改", "稍后提醒"]}, function (index) {
									layer.close(index);
									if (!window.sessionStorage.getItem('isNeedCheckPwdAgainFlag') || window.sessionStorage.getItem('isNeedCheckPwdAgainFlag') != displayName) {
										window.sessionStorage.setItem('isNeedCheckPwdAgainFlag', displayName);   //只要浏览器保持打开状态, sessionStorage 就会持续存在, localStorage 在浏览器重新启动后仍然存在,持久性适用于整个网站不只是它的一个页面。
									}
									//提示修改密码
									$.post('user/showChangePwdPage', function (data) {
										layer.open({
											type: 1,
											title: "修改密码",
											maxmin: true,
											shadeClose: false, //点击遮罩关闭层
											area: ['350px', '250px'],
											content: data,
											closeBtn: 0
										});
									}, "html");
								});
							} else {
								//当前账号不校验弱密码
							}
						},
						complete: function () {
							//请求完成的处理
						},
						error: function () {
							//请求出错处理
						}
					});
				}
			}
	}

//后端接收规则检测示例:

/**
     * 校验弱密码
     * @param paramMap 参数map接收
     * @return 操作结果
     */
    @RequestMapping(value = "/checkWeakPwd", method = {RequestMethod.POST, RequestMethod.GET}, produces = {"application/json;charset=UTF-8"})
    @ResponseBody
    public Map<String, Object> checkWeakPwd(@RequestBody Map<String,Object> paramMap, HttpServletRequest request) {
        /*
        * @param passwordStr        旧密码加密串
        * @param customerId         客户编号
        * @param checkRuleStr       校验字符规则 例如 校验“123456,12345678”这种初始弱密码(多个使用英文逗号拼接),不传默认校验 123456 弱密码
        * @param checkDateStartStr       校验指定日期之后的账号 例如 校验“2021-06-30”之后注册的账号;不传则默认校验全部账号
        * @param checkDateEndStr         校验指定日期之前的账号 例如 校验“2021-07-30”之前注册的账号;不传则默认校验全部账号
         */
        Map<String, Object> result = new HashMap<String, Object>();  //返回结果集
        String passwordStr = null;
        String customerId = null;
        String checkRuleStr = null;
        String checkDateStartStr = null;
        String checkDateEndStr = null;
        if(paramMap.containsKey("passwordStr")){
            passwordStr = (String)paramMap.get("passwordStr");
        }
        if(paramMap.containsKey("customerId")){
            customerId = (String)paramMap.get("customerId");
        }
        if(paramMap.containsKey("checkRuleStr")){
            checkRuleStr = (String)paramMap.get("checkRuleStr");
        }
        if(paramMap.containsKey("checkDateStartStr")){
            checkDateStartStr = (String)paramMap.get("checkDateStartStr");
        }
        if(paramMap.containsKey("checkDateEndStr")){
            checkDateEndStr = (String)paramMap.get("checkDateEndStr");
        }
        try {
            if(StringUtils.isEmpty(checkRuleStr)){
                checkRuleStr = "123456";    //默认校验 123456这种弱密码
            }
            boolean isNeedCheckWeakPwd = false;   //默认不需要校验弱密码
            if(StringUtils.isNotEmpty(passwordStr) && StringUtils.isNotEmpty(customerId)){
                String accountId = ShiroUtils.getUserId();
                Account account = accountService.findAccount(accountId);
                Date registerDate = account.getCreatetime();    //账号注册时间
                if(StringUtils.isNotEmpty(checkDateStartStr) && StringUtils.isNotEmpty(checkDateEndStr)){
                    Date checkDateStart = CalendarUtil.parse(checkDateStartStr,CalendarUtil.FORMAT_THREE);
                    Date checkDateEnd = CalendarUtil.parse(checkDateEndStr,CalendarUtil.FORMAT_THREE);
                    if(registerDate.getTime() >= checkDateStart.getTime() && registerDate.getTime() <= checkDateEnd.getTime()){
                        //注册时间在校验指定时间之内,需要校验弱密码
                        isNeedCheckWeakPwd = true;
                    }
                }else if(StringUtils.isNotEmpty(checkDateStartStr) && StringUtils.isEmpty(checkDateEndStr)){
                    Date checkDateStart = CalendarUtil.parse(checkDateStartStr,CalendarUtil.FORMAT_THREE);
                    if(registerDate.getTime() >= checkDateStart.getTime()){
                        //注册时间在校验指定时间开始之后,需要校验弱密码
                        isNeedCheckWeakPwd = true;
                    }
                }else if(StringUtils.isEmpty(checkDateStartStr) && StringUtils.isNotEmpty(checkDateEndStr)){
                    Date checkDateEnd = CalendarUtil.parse(checkDateEndStr,CalendarUtil.FORMAT_THREE);
                    if(registerDate.getTime() <= checkDateEnd.getTime()){
                        //注册时间在校验指定时间结束之前,需要校验弱密码
                        isNeedCheckWeakPwd = true;
                    }
                }else{
                    //没有传入时间校验限制,则需要校验全部账号的弱密码
                    isNeedCheckWeakPwd = true;
                }
                if(isNeedCheckWeakPwd){
                    if(customerId.equals(account.getCustomerId())){
                        //相同企业才校验账号弱密码
                        if(StringUtils.isNotEmpty(checkRuleStr)){
                            boolean isWeakPwdFlag = false;
                            String[] checkRuleArray = checkRuleStr.split(",");
                            if(checkRuleArray.length > 0){
                                for(int i=0;i<checkRuleArray.length;i++){
                                    String entriedNewPwd = EncryptHelper.entrypt(checkRuleArray[i], account.getSalt());   //校验规则+原来账号salt 得到密码加密串
                                    if (passwordStr.equals(entriedNewPwd)) {
                                        isWeakPwdFlag = true;  //此密码为弱密码
                                        break;
                                    }
                                }
                            }
                            if (isWeakPwdFlag) {
                                result.put("code","0");
                                result.put("msg","当前账号存在弱密码风险,请及时更改!");
                            }else{
                                result.put("code","1");
                                result.put("msg","不存在弱密码!");
                            }
                        }
                    }else{
                        result.put("code","1");
                        result.put("msg","当前账号所在企业与传入企业不符!");
                    }
                }else{
                    result.put("code","1");
                    result.put("msg","不校验弱密码!");
                }
            }else{
                result.put("code","1");
                result.put("msg","参数为空,不进行校验!");
            }
        } catch (Exception e) {
            result.put("code", "1");
            if (e instanceof IncorrentParameterException) {
                result.put("msg", e.getMessage());
            } else {
                result.put("msg", "校验弱密码失败!");
            }
        }
        return result;
    }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的示例代码: 首先,定义一个自定义注解 `DateValid`: ``` import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface DateValid { String message() default "日期格式不正确"; String pattern() default "yyyy-MM-dd"; } ``` 然后,在需要校验时间格式的类中,使用 `@DateValid` 注解对时间字段进行标注,并编写校验逻辑: ``` import java.lang.reflect.Field; import java.text.SimpleDateFormat; import java.util.Date; public class DateValidator { public static void validate(Object obj) throws Exception { Class<?> clazz = obj.getClass(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { if (field.isAnnotationPresent(DateValid.class)) { field.setAccessible(true); Object value = field.get(obj); if (value != null) { DateValid dateValid = field.getAnnotation(DateValid.class); String pattern = dateValid.pattern(); SimpleDateFormat sdf = new SimpleDateFormat(pattern); try { sdf.parse(value.toString()); } catch (Exception e) { throw new RuntimeException(dateValid.message()); } } } } } } ``` 最后,在测试类中创建一个对象,设置时间字段并调用 `DateValidator.validate()` 方法进行校验: ``` public class Test { public static void main(String[] args) throws Exception { User user = new User(); user.setName("张三"); user.setBirthDate("1990-01-01"); DateValidator.validate(user); } } class User { private String name; @DateValid(pattern = "yyyy-MM-dd") private String birthDate; // 省略 getter 和 setter 方法 } ``` 在上面的示例中,我们使用 `@DateValid(pattern = "yyyy-MM-dd")` 注解对 `birthDate` 字段进行了标注,并指定了时间格式为 `yyyy-MM-dd`。在调用 `DateValidator.validate()` 方法时,会根据该注解进行校验,如果时间格式不正确,会抛出 `RuntimeException` 异常,并输出错误信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值