首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring Security 登錄失敗 5 次鎖定賬戶實現方案

     編輯:Java 相關知識

業務場景

用戶連續輸入錯誤密碼達到閾值(如 5 次),自動鎖定賬戶;登錄成功後重置失敗計數並解鎖。

核心設計

  • 利用 Spring Security 事件機制:AuthenticationSuccessEvent、AuthenticationFailureBadCredentialsEvent。
  • 監聽器異步處理業務邏輯,不阻塞認證流程。
  • 失敗閾值從參數表讀取,支持動態調整無需發布。

實現步驟

1. 數據庫擴展

ALTER TABLE t_yft_user ADD (FAILS NUMBER(11) DEFAULT 0);
COMMENT ON COLUMN t_yft_user.FAILS IS '失敗嘗試次數';

-- 參數表存儲閾值
INSERT INTO t_yft_params (ID, CODE, NAME, VALUE, UNIT, REMARK, CRT_DATE)
VALUES (66, 'FAILS_COUNT', '登陸嘗試次數', '5', '', '', TO_DATE('2017-03-02','yyyy-mm-dd'));

2. 登錄成功監聽器 - 重置計數/解鎖

3. 登錄失敗監聽器 - 累計失敗/超閾值鎖定

= threshold) {
            // 超過閾值:鎖定賬戶 (ENABLE=false)
            userDao.updateStatusByAccount(account, "false", fails);
        } else {
            // 未超閾值:僅增加失敗次數,保持原啟用狀態
            userDao.updateStatusByAccount(account, user.get("ENABLE").toString(), fails);
        }
    }
}

4. DAO 更新方法

關鍵點解析

要點說明
事件異步Spring 默認同步發布,若業務耗時可加 @Async + @EnableAsync 異步化。
Principal 類型成功事件中 getPrincipal() 返回 UserDetails 實現類;失敗事件返回用戶名字符串。
鎖定狀態持久化更新 ENABLE=false,Spring Security DaoAuthenticationProvider 會自動檢查 UserDetails.isEnabled() 拒絕登錄。
閾值配置化存參數表,運行期修改即時生效,無需重啟。
分佈式擴展集群環境建議用 Redis 計數器 (INCR + EXPIRE) 替代數據庫,性能更強。

擴展:解鎖策略

  • 管理員後台手動解鎖(更新 ENABLE=true, FAILS=0)。
  • 定時任務定期解鎖(如 24 小時後自動重置)。
  • 用戶通過郵箱/手機驗證碼自助解鎖。

總結

基於 Spring Security 事件機制實現登錄失敗鎖定,代碼解耦、擴展性強。核心在於:成功事件重置計數、失敗事件累計並判斷閾值鎖定、閾值外部化配置。生產環境建議結合 Redis 計數器與異步事件提升性能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved