Skip to content

Commit

Permalink
feat(auth): log login failures
Browse files Browse the repository at this point in the history
  • Loading branch information
gquintana committed May 13, 2021
1 parent a80a4c1 commit 430322e
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 11 deletions.
31 changes: 20 additions & 11 deletions src/main/java/org/akhq/modules/BasicAuthAuthenticationProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,12 @@

import io.micronaut.core.annotation.Nullable;
import io.micronaut.http.HttpRequest;
import io.micronaut.security.authentication.*;
import io.micronaut.security.authentication.AuthenticationFailed;
import io.micronaut.security.authentication.AuthenticationFailureReason;
import io.micronaut.security.authentication.AuthenticationProvider;
import io.micronaut.security.authentication.AuthenticationRequest;
import io.micronaut.security.authentication.AuthenticationResponse;
import io.micronaut.security.authentication.UserDetails;
import io.reactivex.Flowable;
import org.akhq.configs.BasicAuth;
import org.akhq.configs.Ldap;
Expand All @@ -13,6 +18,8 @@

import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.Collections;
import java.util.Optional;

@Singleton
public class BasicAuthAuthenticationProvider implements AuthenticationProvider {
Expand All @@ -28,18 +35,20 @@ public class BasicAuthAuthenticationProvider implements AuthenticationProvider {

@Override
public Publisher<AuthenticationResponse> authenticate(@Nullable HttpRequest<?> httpRequest, AuthenticationRequest<?, ?> authenticationRequest) {
for(BasicAuth auth : securityProperties.getBasicAuth()) {
if (authenticationRequest.getIdentity().equals(auth.getUsername()) &&
auth.isValidPassword((String) authenticationRequest.getSecret())) {

UserDetails userDetails = new UserDetails(auth.getUsername(),
userGroupUtils.getUserRoles(auth.getGroups()),
userGroupUtils.getUserAttributes(auth.getGroups()));

return Flowable.just(userDetails);
String username = String.valueOf(authenticationRequest.getIdentity());
for (BasicAuth auth : securityProperties.getBasicAuth()) {
if (!username.equals(auth.getUsername())) {
continue;
}
if (!auth.isValidPassword((String) authenticationRequest.getSecret())) {
return Flowable.just(new AuthenticationFailed(AuthenticationFailureReason.CREDENTIALS_DO_NOT_MATCH));
}
UserDetails userDetails = new UserDetails(username,
userGroupUtils.getUserRoles(auth.getGroups()),
userGroupUtils.getUserAttributes(auth.getGroups()));
return Flowable.just(userDetails);
}

return Flowable.just(new AuthenticationFailed());
return Flowable.just(new AuthenticationFailed(AuthenticationFailureReason.USER_NOT_FOUND));
}
}
30 changes: 30 additions & 0 deletions src/main/java/org/akhq/utils/LoginFailedEventListener.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package org.akhq.utils;

import io.micronaut.context.event.ApplicationEventListener;
import io.micronaut.security.authentication.AuthenticationFailed;
import io.micronaut.security.authentication.UserDetails;
import io.micronaut.security.event.LoginFailedEvent;
import lombok.extern.slf4j.Slf4j;

import javax.inject.Singleton;

@Singleton
@Slf4j
public class LoginFailedEventListener implements ApplicationEventListener<LoginFailedEvent> {
@Override
public void onApplicationEvent(LoginFailedEvent event) {
if (event.getSource() instanceof AuthenticationFailed) {
AuthenticationFailed authenticationFailed = (AuthenticationFailed) event.getSource();
log.warn("Login failed reason {}, username {}, message {}",
authenticationFailed.getReason(),
authenticationFailed.getUserDetails().map(UserDetails::getUsername).orElse("unknown"),
authenticationFailed.getMessage().orElse("none")
);
}
}

@Override
public boolean supports(LoginFailedEvent event) {
return true;
}
}

0 comments on commit 430322e

Please sign in to comment.