用戶安全性配置

需求如下:
在這裏插入圖片描述需求說明:
1.臨時用戶,設置用戶可使用時間,到期後則狀態則改爲禁用,且不可登錄,月、日按自然日計算,按用戶創建時間開始計算。
2、取消輸入密碼,後臺自動生成初始密碼,密碼規則符合:大寫字母、小寫字母、數字、特殊字符應選三種或以上
3.新建用戶成功後將自動生成的初始密碼發送至該用戶郵箱
4、用戶使用初始密碼登錄後彈出修改密碼窗口,強制修改密碼
5、登錄時檢測用戶登錄IP是否與綁定IP相同,異常則進行郵件報警,且不讓登錄提示“IP異常,無法登錄”
6、用戶若未在設置登錄時間範圍內則不可登錄,提示內容”當前時間不在登錄時間範圍內容,請稍後重試“


開發

因爲要進行編輯,所以這些字段都需要保持到數據庫中

-- 新增用戶類型:(0代表長期,1代表臨時) 
ALTER TABLE user_info ADD `user_type` tinyint(4) NOT NULL COMMENT '用戶類型:0長期;1臨時' ;

-- 新增臨時用戶有效時間
ALTER TABLE user_info ADD `period` tinyint(4) COLLATE utf8_bin DEFAULT NULL COMMENT '有效時間:大於0的正整數' ;

-- 新增臨時用戶有效時間單位
ALTER TABLE user_info ADD `period_unit` varchar(8)  COLLATE utf8_bin DEFAULT NULL COMMENT '有效時間單位:日day,月month' ;

-- 新增綁定ip字段
ALTER TABLE user_info ADD `user_bind_ip` varchar(16)  COLLATE utf8_bin DEFAULT NULL COMMENT '綁定ip' ;

-- 登錄時間範圍:開始時間
ALTER TABLE user_info ADD `begin_time` varchar(8) COLLATE utf8_bin DEFAULT NULL COMMENT '登錄開始時間' ;

-- 登錄時間範圍:結束時間
ALTER TABLE user_info ADD `end_time` varchar(8)  COLLATE utf8_bin DEFAULT NULL COMMENT '登錄結束時間' ;

-- 新增是否是否需要修改密碼
ALTER TABLE user_info ADD `change_password` tinyint(1) NOT NULL COMMENT '是否要修改密碼:0需要修改,1不需要修改' ;

ps:需要注意的是在mysql中 tinyint(1) 和 tinyint(4)是不同的意思

  • tinyint(1):boolean類型(1代表true,0代表false)
  • tinyint(4):Integer類型,不過只能接受最大爲9999

思路

需求:臨時用戶,設置用戶可使用時間,到期後則狀態則改爲禁用,且不可登錄,月、日按自然日計算,按用戶創建時間開始計算

(1)當用戶設置爲臨時用戶後,每次在登錄的時候都根據用戶類型進行判斷
(2)如果是臨時用戶,則判斷當前是否過期,過期則將用戶狀態設置爲禁用

//判斷用戶類型:0爲長期;1爲臨時
Integer type = user.getType();
if (UserApi.TEMP_USER.equals(type)) {
	//臨時用戶,判斷是否過期,過期則將用戶狀態設置爲禁用
	Integer period = user.getPeriod();					//有效時間週期,大於0的整數
	String periodUnit = user.getPeriodUnit();			//有效時間單位,day或者month

	//根據用戶創建的時間,計算出過期時間
	Date createdTime = user.getCreated();
	Calendar validCalendar = Calendar.getInstance();
	validCalendar.setTime(createdTime);
	if (periodUnit.equals("day")) {
		validCalendar.add(Calendar.DATE, period);		//有效時間單位是day時
	} else {
		validCalendar.add(Calendar.MONTH, period);		//有效時間單位是month時
	}

	//判斷當前時間是否已經過期
	Calendar currentCalendar = Calendar.getInstance();
	currentCalendar.setTime(new Date());

	//當前時間,在有效時間以外
	if (currentCalendar.after(validCalendar)) {
		//將用戶狀態設置爲禁用
		user.setEnabled(false);
		userDao.save(user);
		mav.addObject("errorMsg", "臨時用戶已過期,無法登錄!");
		//跳轉到登錄頁面
		return mav;
	}
}

這類用戶過期,因爲跟用戶創建時間有關,當用戶過期後,狀態被設置爲禁用,即使通過管理員將其狀態重新更新爲啓用,登錄後還是會重新檢測到設置了過期時間,再次設置爲禁用,然後跳轉到登錄頁面

解決方式:不單單修改用戶的狀態,同時還要設置用戶類型

  • 設置用戶類型爲長期:登錄時,不再進行用戶類型判斷,直接登錄
  • 設置用戶類型爲臨時:延長過期時間,即可

需求:用戶若未在設置登錄時間範圍內則不可登錄,提示內容”當前時間不在登錄時間範圍內容,請稍後重試“
在登錄時,獲取登錄開始時間和登錄結束時間,進行判斷

//判斷用戶登錄是否在設置的登錄時間範圍內
try {
	String beginTime = user.getBeginTime();
	String endTime = user.getEndTime();
	
	//兩個時間都存在時,進行登錄時間範圍校驗
	if (StringUtils.isNotBlank(beginTime) && StringUtils.isNotBlank(endTime)) {
		//判斷兩個時間段是否在同一天,例如23:00~02:00,就不屬於同一天
		boolean isSameDay = DateUtil.isSameDay(beginTime, endTime);
		if (isSameDay) {
			//同一天
			if (!DateUtil.withinTimeRange(beginTime, endTime)) {
				mav.addObject("errorMsg", "當前時間不在登錄時間範圍內容,請稍後重試!");
				return mav;
			}
		} else {
			//隔日(進行兩次判斷)
			if (!DateUtil.withinTimeRange(beginTime, "23:59") &&
					!DateUtil.withinTimeRange("00:00", endTime)) {
				mav.addObject("errorMsg", "當前時間不在登錄時間範圍內容,請稍後重試!");
				return mav;
			}
		}
	}
} catch (ParseException e) {
	mav.addObject("errorMsg", "登錄時間範圍內容異常!");
	return mav;
}

/**
 * 開始時間和結束時間是否在同一天內
 * @param start 開始時間   格式爲00:00(時:分)
 * @param end 結束時間   格式爲00:00
 * @return	true代表兩個時間段在同一天;false代表兩個時間段不在同一天
 * @throws ParseException
 */
public static boolean isSameDay(String start, String end) throws ParseException {
	DateFormat format = new SimpleDateFormat("HH:mm");
	Date startTime = format.parse(start);
	Date endTime = format.parse(end);
	if (endTime.after(startTime)) {
		return true;
	} else {
		return false;
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章