105 String userId =
event.userId;
106 UserModel user = session.users().getUserById(userId, realm);
111 UserLoginFailureModel userLoginFailure =
getUserModel(session, event);
112 if (userLoginFailure == null) {
113 userLoginFailure = session.sessions().addUserLoginFailure(realm, userId);
115 userLoginFailure.setLastIPFailure(event.ip);
116 long currentTime = Time.currentTimeMillis();
117 long last = userLoginFailure.getLastFailure();
120 deltaTime = currentTime - last;
122 userLoginFailure.setLastFailure(currentTime);
124 if(realm.isPermanentLockout()) {
125 userLoginFailure.incrementFailures();
126 logger.debugv(
"new num failures: {0}", userLoginFailure.getNumFailures());
128 if(userLoginFailure.getNumFailures() == realm.getFailureFactor()) {
129 logger.debugv(
"user {0} locked permanently due to too many login attempts", user.getUsername());
130 user.setEnabled(
false);
134 if (last > 0 && deltaTime < realm.getQuickLoginCheckMilliSeconds()) {
135 logger.debugv(
"quick login, set min wait seconds");
136 int waitSeconds = realm.getMinimumQuickLoginWaitSeconds();
137 int notBefore = (int) (currentTime / 1000) + waitSeconds;
138 logger.debugv(
"set notBefore: {0}", notBefore);
139 userLoginFailure.setFailedLoginNotBefore(notBefore);
146 if (deltaTime > (
long) realm.getMaxDeltaTimeSeconds() * 1000L) {
147 userLoginFailure.clearFailures();
150 userLoginFailure.incrementFailures();
151 logger.debugv(
"new num failures: {0}", userLoginFailure.getNumFailures());
153 int waitSeconds = realm.getWaitIncrementSeconds() * (userLoginFailure.getNumFailures() / realm.getFailureFactor());
154 logger.debugv(
"waitSeconds: {0}", waitSeconds);
155 logger.debugv(
"deltaTime: {0}", deltaTime);
157 if (waitSeconds == 0) {
158 if (last > 0 && deltaTime < realm.getQuickLoginCheckMilliSeconds()) {
159 logger.debugv(
"quick login, set min wait seconds");
160 waitSeconds = realm.getMinimumQuickLoginWaitSeconds();
163 if (waitSeconds > 0) {
164 waitSeconds = Math.min(realm.getMaxFailureWaitSeconds(), waitSeconds);
165 int notBefore = (int) (currentTime / 1000) + waitSeconds;
166 logger.debugv(
"set notBefore: {0}", notBefore);
167 userLoginFailure.setFailedLoginNotBefore(notBefore);
UserLoginFailureModel getUserModel(KeycloakSession session, LoginEvent event)
Definition: DefaultBruteForceProtector.java:172
RealmModel getRealmModel(KeycloakSession session, LoginEvent event)
Definition: DefaultBruteForceProtector.java:180
static final Logger logger
Definition: DefaultBruteForceProtector.java:43
void logFailure(LoginEvent event)
Definition: DefaultBruteForceProtector.java:263