多次密碼錯誤,凍結登入
阿新 • • 發佈:2019-02-01
多次密碼輸入錯誤,凍結登入。
新建一個登入控制的類,引數為:登入次數,控制時間,控制的商編(使用者名稱),控制型別。
在登入的時候做密碼是否正確的判斷。
在使用者實體中,建立方法 判斷密碼是否正確。返回boolean。
在登入的方法中,驗證登入次數。
首先根據使用者名稱,控制型別,去資料庫中取 控制登入 的記錄 只有一條(首次登入時並且發生錯誤 新建立一條記錄 設定登入次數為1)
然後判斷這次登入時間與 取出來的 控制記錄中的時間差 同時取得控制記錄的 登入次數
然後比對,時間差 小於 自定義的時間差 並且 登入次數大於 自定義的登入次數直接返回false。
如果驗證失敗,並且時間間隔 小於 自定義的時間差 登入控制記錄次數+1
如果時間間隔 不小於 自定義時間差 控制記錄次數為1
如果登入成功,登入控制記錄次數歸零 同時 設定登入控制記錄的 控制時間 為當前時間
程式碼:
登入記錄控制類
public class LoginControl extends AutoIDEntity {
/**
* 次數
*/
private int frequency;
/**
* 控制時間
*/
private Date controlTime;
/**
* 控制的使用者
*/
private String controlTarget;
/**
* 控制型別
*/
private ControlType controlType;
public LoginControl(){
}
public LoginControl(String controlTarget){
this.frequency = 0;
this.controlTime = new Date();
this.controlTarget = controlTarget;
this.controlType = ControlType.LOGINCONTROL;
}
public LoginControl(String controlTarget,ControlType controlType){
this.frequency = 0;
this.controlTime = new Date();
this.controlTarget = controlTarget;
this.controlType = controlType;
}
public int getFrequency() {
return frequency;
}
public void setFrequency(int frequency) {
this.frequency = frequency;
}
public Date getControlTime() {
return controlTime;
}
public void setControlTime(Date controlTime) {
this.controlTime = controlTime;
}
public String getControlTarget() {
return controlTarget;
}
public void setControlTarget(String controlTarget) {
this.controlTarget = controlTarget;
}
@Enumerated(value=EnumType.STRING)
@Column(length = 20)
public ControlType getControlType() {
return controlType;
}
public void setControlType(ControlType controlType) {
this.controlType = controlType;
}
}
登入驗證:
private boolean checkPasswordTimes() {
try {
User user = userService.getUserByLoginName(username);
//判斷password是否正確
boolean verifyResult = user.validPassword(password);
String target = user.getId().toString();
LoginControl loginControl = loginControlService.getByControlTarget(target, ControlType.LOGINCONTROL);
Date date = new Date();
// 這次輸入和上次錯誤的時間差
if (loginControl == null && !verifyResult) {
loginControl = new LoginControl(target, ControlType.LOGINCONTROL);
loginControl.setFrequency(1);
loginControlService.createLoginControl(loginControl);
}
Long time = (date.getTime() - loginControl.getControlTime().getTime()) / (1000 * 60);
// 如果商戶密碼錯誤次數超限,並且時間差小於凍結時間
if (loginControl.getFrequency() >= maxFrequency && time < suspendTime) {
return false;
}
// 登陸密碼驗證失敗
if (!verifyResult) {
if (time <= againTime) {
loginControl.setFrequency(loginControl.getFrequency() + 1);
} else {
loginControl.setFrequency(1);
}
} else {
loginControl.setFrequency(0);
}
loginControl.setControlTime(new Date());
loginControlService.updateFrequency(loginControl);
} catch (Exception e) {
logger.info("password times check error:" + username,e);
}
return true;
}
新建一個登入控制的類,引數為:登入次數,控制時間,控制的商編(使用者名稱),控制型別。
在登入的時候做密碼是否正確的判斷。
在使用者實體中,建立方法 判斷密碼是否正確。返回boolean。
在登入的方法中,驗證登入次數。
首先根據使用者名稱,控制型別,去資料庫中取 控制登入 的記錄 只有一條(首次登入時並且發生錯誤 新建立一條記錄 設定登入次數為1)
然後判斷這次登入時間與 取出來的 控制記錄中的時間差 同時取得控制記錄的 登入次數
然後比對,時間差 小於 自定義的時間差 並且 登入次數大於 自定義的登入次數直接返回false。
如果驗證失敗,並且時間間隔 小於 自定義的時間差 登入控制記錄次數+1
如果時間間隔 不小於 自定義時間差 控制記錄次數為1
如果登入成功,登入控制記錄次數歸零 同時 設定登入控制記錄的 控制時間 為當前時間
程式碼:
登入記錄控制類
public class LoginControl extends AutoIDEntity {
/**
* 次數
*/
private int frequency;
/**
* 控制時間
*/
private Date controlTime;
/**
* 控制的使用者
*/
private String controlTarget;
/**
* 控制型別
*/
private ControlType controlType;
public LoginControl(){
}
public LoginControl(String controlTarget){
this.frequency = 0;
this.controlTime = new Date();
this.controlTarget = controlTarget;
this.controlType = ControlType.LOGINCONTROL;
}
public LoginControl(String controlTarget,ControlType controlType){
this.frequency = 0;
this.controlTime = new Date();
this.controlTarget = controlTarget;
this.controlType = controlType;
}
public int getFrequency() {
return frequency;
}
public void setFrequency(int frequency) {
this.frequency = frequency;
}
public Date getControlTime() {
return controlTime;
}
public void setControlTime(Date controlTime) {
this.controlTime = controlTime;
}
public String getControlTarget() {
return controlTarget;
}
public void setControlTarget(String controlTarget) {
this.controlTarget = controlTarget;
}
@Enumerated(value=EnumType.STRING)
@Column(length = 20)
public ControlType getControlType() {
return controlType;
}
public void setControlType(ControlType controlType) {
this.controlType = controlType;
}
}
登入驗證:
private boolean checkPasswordTimes() {
try {
User user = userService.getUserByLoginName(username);
//判斷password是否正確
boolean verifyResult = user.validPassword(password);
String target = user.getId().toString();
LoginControl loginControl = loginControlService.getByControlTarget(target, ControlType.LOGINCONTROL);
Date date = new Date();
// 這次輸入和上次錯誤的時間差
if (loginControl == null && !verifyResult) {
loginControl = new LoginControl(target, ControlType.LOGINCONTROL);
loginControl.setFrequency(1);
loginControlService.createLoginControl(loginControl);
}
Long time = (date.getTime() - loginControl.getControlTime().getTime()) / (1000 * 60);
// 如果商戶密碼錯誤次數超限,並且時間差小於凍結時間
if (loginControl.getFrequency() >= maxFrequency && time < suspendTime) {
return false;
}
// 登陸密碼驗證失敗
if (!verifyResult) {
if (time <= againTime) {
loginControl.setFrequency(loginControl.getFrequency() + 1);
} else {
loginControl.setFrequency(1);
}
} else {
loginControl.setFrequency(0);
}
loginControl.setControlTime(new Date());
loginControlService.updateFrequency(loginControl);
} catch (Exception e) {
logger.info("password times check error:" + username,e);
}
return true;
}