package de.ahus1.keycloak.dropwizard;
import io.dropwizard.auth.AuthenticationException;
import io.dropwizard.auth.Authenticator;
import org.keycloak.KeycloakSecurityContext;
import javax.servlet.http.HttpServletRequest;
import java.security.Principal;
import java.util.Optional;
/**
* Authentication to make it work with Keycloak.
* @param <P> authentication class you will use throughout your application.
* You can use AbstractAuthentication as a base class here.
*/
public abstract class AbstractKeycloakAuthenticator<P extends Principal> implements Authenticator<HttpServletRequest, P> {
private final KeycloakConfiguration keycloakConfiguration;
public AbstractKeycloakAuthenticator(final KeycloakConfiguration keycloakConfiguration) {
this.keycloakConfiguration = keycloakConfiguration;
}
@Override
public Optional<P> authenticate(HttpServletRequest request) throws AuthenticationException {
KeycloakSecurityContext securityContext = (KeycloakSecurityContext) request.getAttribute(KeycloakSecurityContext.class.getName());
if (securityContext != null) {
return Optional.ofNullable(prepareAuthentication(securityContext, request, keycloakConfiguration));
} else {
return Optional.empty();
}
}
protected abstract P prepareAuthentication(KeycloakSecurityContext securityContext, HttpServletRequest request, KeycloakConfiguration keycloakConfiguration);
}