This is the codeAbility Sharing Platform! Learn more about the codeAbility Sharing Platform.

Skip to content
Snippets Groups Projects

Draft: Resolve "Docker Infrastruktur: Startup Probleme von Sharing Plattform und KeyCloak beheben."

Viewing commit 9e465fbc
Show latest version
3 files
+ 81
23
Compare changes
  • Side-by-side
  • Inline
Files
3
@@ -11,22 +11,30 @@ import at.ac.uibk.gitsearch.security.oauth2.SavedRequestAwareAuthenticationSucce
import at.ac.uibk.gitsearch.security.oauth2.UserDetailsFetcher;
import at.ac.uibk.gitsearch.service.UserService;
import at.ac.uibk.gitsearch.service.dto.AdminUserDTO;
import at.ac.uibk.gitsearch.service.dto.OAuth2ConfigDTO;
import at.ac.uibk.gitsearch.service.mapper.UserMapper;
import java.net.InetAddress;
import java.net.URI;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import javax.annotation.Nonnull;
import javax.annotation.PostConstruct;
import javax.servlet.DispatcherType;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.ServiceUnavailableException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientProperties;
import org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientPropertiesRegistrationAdapter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;
@@ -57,6 +65,8 @@ import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCo
import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserRequest;
import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService;
import org.springframework.security.oauth2.client.registration.ClientRegistration;
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository;
import org.springframework.security.oauth2.client.userinfo.OAuth2UserService;
import org.springframework.security.oauth2.client.web.AuthorizationRequestRepository;
import org.springframework.security.oauth2.client.web.OAuth2LoginAuthenticationFilter;
@@ -83,6 +93,7 @@ import org.springframework.security.web.header.writers.ReferrerPolicyHeaderWrite
import org.springframework.security.web.util.matcher.AndRequestMatcher;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import org.springframework.security.web.util.matcher.RequestMatcher;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.filter.CorsFilter;
@@ -511,4 +522,61 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
return oidcUser;
};
}
/**
* overriding, in order to handle failed OAuth2 initializations. We defer the
* initialization to later.
*
* @param properties
* @return
*/
@Service(value = "clientRegistrationRepository")
public static class DeferredClientRegistrationRepository implements ClientRegistrationRepository {
private static final Logger logger = LogManager.getLogger(SecurityConfiguration.class);
@Autowired
private OAuth2ClientProperties properties;
private InMemoryClientRegistrationRepository wrapped;
@PostConstruct
public void init() {
List<ClientRegistration> registrations;
try {
registrations = new ArrayList<>(OAuth2ClientPropertiesRegistrationAdapter.getClientRegistrations(properties).values());
} catch (IllegalArgumentException e) {
logger.warn("Cannot initialize OAuth Client Infrastructure. Deferring Initializition to first request.", e);
return;
}
wrapped = new InMemoryClientRegistrationRepository(registrations);
}
private void initOrThrow() throws ServiceUnavailableException {
List<ClientRegistration> registrations;
try {
registrations = new ArrayList<>(OAuth2ClientPropertiesRegistrationAdapter.getClientRegistrations(properties).values());
} catch (IllegalArgumentException e) {
throw new ServiceUnavailableException("OAuth2 Service not yet initialized: " + e.getMessage());
}
wrapped = new InMemoryClientRegistrationRepository(registrations);
}
@Override
public ClientRegistration findByRegistrationId(String registrationId) {
initOrThrow();
return wrapped.findByRegistrationId(registrationId);
}
public OAuth2ConfigDTO[] getPublicRegistrations() {
initOrThrow();
final List<OAuth2ConfigDTO> result = new ArrayList<>();
wrapped.iterator().forEachRemaining(registration -> result.add(buildConfigFromRegistration(registration)));
return result.toArray(new OAuth2ConfigDTO[] {});
}
private OAuth2ConfigDTO buildConfigFromRegistration(ClientRegistration registration) {
return new OAuth2ConfigDTO(registration);
}
}
}