Skip to content

Commit

Permalink
Refactor tchiotludo#699 + Exception Handling
Browse files Browse the repository at this point in the history
  • Loading branch information
Julien Chanaud committed May 18, 2021
1 parent 5aba780 commit eea9a71
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 25 deletions.
49 changes: 28 additions & 21 deletions src/main/java/org/akhq/modules/BasicAuthAuthenticationProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

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

@Singleton
public class BasicAuthAuthenticationProvider implements AuthenticationProvider {
Expand All @@ -22,29 +23,35 @@ public class BasicAuthAuthenticationProvider implements AuthenticationProvider {
@Override
public Publisher<AuthenticationResponse> authenticate(@Nullable HttpRequest<?> httpRequest, AuthenticationRequest<?, ?> authenticationRequest) {
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));
}
ClaimProvider.AKHQClaimRequest request =
ClaimProvider.AKHQClaimRequest.builder()
.providerType(ClaimProvider.ProviderType.BASIC_AUTH)
.providerName(null)
.username(auth.getUsername())
.groups(auth.getGroups())
.build();
Optional<BasicAuth> optionalBasicAuth = securityProperties.getBasicAuth()
.stream()
.filter(basicAuth -> basicAuth.getUsername().equals(username))
.findFirst();

ClaimProvider.AKHQClaimResponse claim = claimProvider.generateClaim(request);
UserDetails userDetails = new UserDetails(
auth.getUsername(),
claim.getRoles(),
claim.getAttributes());
return Flowable.just(userDetails);
// User not found
if(optionalBasicAuth.isEmpty()){
return Flowable.just(new AuthenticationFailed(AuthenticationFailureReason.USER_NOT_FOUND));
}
BasicAuth auth = optionalBasicAuth.get();

// Invalid password
if (!auth.isValidPassword((String) authenticationRequest.getSecret())) {
return Flowable.just(new AuthenticationFailed(AuthenticationFailureReason.CREDENTIALS_DO_NOT_MATCH));
}

return Flowable.just(new AuthenticationFailed(AuthenticationFailureReason.USER_NOT_FOUND));
ClaimProvider.AKHQClaimRequest request =
ClaimProvider.AKHQClaimRequest.builder()
.providerType(ClaimProvider.ProviderType.BASIC_AUTH)
.providerName(null)
.username(auth.getUsername())
.groups(auth.getGroups())
.build();
try {
ClaimProvider.AKHQClaimResponse claim = claimProvider.generateClaim(request);
return Flowable.just(new UserDetails(auth.getUsername(), claim.getRoles(), claim.getAttributes()));
} catch (Exception e) {
String claimProviderClass = claimProvider.getClass().getName();
return Flowable.just(new AuthenticationFailed("Exception from ClaimProvider " + claimProviderClass + ": " + e.getMessage()));
}
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package org.akhq.modules;

import io.micronaut.security.authentication.AuthenticationResponse;
import io.micronaut.security.authentication.UserDetails;
import io.micronaut.security.authentication.UsernamePasswordCredentials;
import io.micronaut.security.authentication.*;
import io.reactivex.Flowable;
import org.akhq.AbstractTest;
import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -44,13 +42,27 @@ public void success() {
}

@Test
public void failed() {
public void failed_UserNotFound() {
AuthenticationResponse response = Flowable
.fromPublisher(auth.authenticate(null, new UsernamePasswordCredentials(
"user2",
"pass2"
))).blockingFirst();

assertFalse(response.isAuthenticated());
AuthenticationFailed authenticationFailed = (AuthenticationFailed) response;
assertEquals(AuthenticationFailureReason.USER_NOT_FOUND, authenticationFailed.getReason());
}
@Test
public void failed_PasswordInvalid() {
AuthenticationResponse response = Flowable
.fromPublisher(auth.authenticate(null, new UsernamePasswordCredentials(
"user",
"invalid-pass"
))).blockingFirst();

assertFalse(response.isAuthenticated());
AuthenticationFailed authenticationFailed = (AuthenticationFailed) response;
assertEquals(AuthenticationFailureReason.CREDENTIALS_DO_NOT_MATCH, authenticationFailed.getReason());
}
}

0 comments on commit eea9a71

Please sign in to comment.