用戶連續輸入錯誤密碼達到閾值(如 5 次),自動鎖定賬戶;登錄成功後重置失敗計數並解鎖。
AuthenticationSuccessEvent、AuthenticationFailureBadCredentialsEvent。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'));
= threshold) {
// 超過閾值:鎖定賬戶 (ENABLE=false)
userDao.updateStatusByAccount(account, "false", fails);
} else {
// 未超閾值:僅增加失敗次數,保持原啟用狀態
userDao.updateStatusByAccount(account, user.get("ENABLE").toString(), fails);
}
}
}
| 要點 | 說明 |
|---|---|
| 事件異步 | Spring 默認同步發布,若業務耗時可加 @Async + @EnableAsync 異步化。 |
| Principal 類型 | 成功事件中 getPrincipal() 返回 UserDetails 實現類;失敗事件返回用戶名字符串。 |
| 鎖定狀態持久化 | 更新 ENABLE=false,Spring Security DaoAuthenticationProvider 會自動檢查 UserDetails.isEnabled() 拒絕登錄。 |
| 閾值配置化 | 存參數表,運行期修改即時生效,無需重啟。 |
| 分佈式擴展 | 集群環境建議用 Redis 計數器 (INCR + EXPIRE) 替代數據庫,性能更強。 |
ENABLE=true, FAILS=0)。基於 Spring Security 事件機制實現登錄失敗鎖定,代碼解耦、擴展性強。核心在於:成功事件重置計數、失敗事件累計並判斷閾值鎖定、閾值外部化配置。生產環境建議結合 Redis 計數器與異步事件提升性能。