1. 程式人生 > >多次密碼錯誤,凍結登入

多次密碼錯誤,凍結登入

多次密碼輸入錯誤,凍結登入。
新建一個登入控制的類,引數為:登入次數,控制時間,控制的商編(使用者名稱),控制型別。
在登入的時候做密碼是否正確的判斷。


在使用者實體中,建立方法 判斷密碼是否正確。返回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;
    }