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

Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • development/sharing/codeability-sharing-platform
1 result
Show changes
Commits on Source (1)
......@@ -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);
}
}
}
package at.ac.uibk.gitsearch.service.oauth2;
import at.ac.uibk.gitsearch.config.SecurityConfiguration.DeferredClientRegistrationRepository;
import at.ac.uibk.gitsearch.service.dto.OAuth2ConfigDTO;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
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.stereotype.Service;
/**
* provides functions for the retrieval of information on configured OAuth2 services
* provides functions for the retrieval of information on configured OAuth2
* services
*
* @author Michael Breu
*/
@Service
......@@ -22,31 +21,17 @@ public class OAuth2ConfigService {
@Autowired
@SuppressWarnings("PMD.ImmutableField")
private ClientRegistrationRepository oauth2ClientRegistrationRepositories;
private DeferredClientRegistrationRepository oauth2ClientRegistrationRepositories;
public OAuth2ConfigDTO findByRegistrationId(String registrationId) {
final ClientRegistration registration = oauth2ClientRegistrationRepositories.findByRegistrationId(registrationId);
if (registration == null) {
return null;
}
return buildConfigFromRegistration(registration);
return new OAuth2ConfigDTO(registration);
}
public OAuth2ConfigDTO[] getPublicRegistrations() {
if (oauth2ClientRegistrationRepositories instanceof InMemoryClientRegistrationRepository) {
InMemoryClientRegistrationRepository imOAuth2ClientRegistrationRepositories = (InMemoryClientRegistrationRepository) oauth2ClientRegistrationRepositories;
final List<OAuth2ConfigDTO> result = new ArrayList<>();
imOAuth2ClientRegistrationRepositories
.iterator()
.forEachRemaining(registration -> result.add(buildConfigFromRegistration(registration)));
return result.toArray(new OAuth2ConfigDTO[] {});
} else {
log.warn("Cannot find any OAuth2 Registrations");
return new OAuth2ConfigDTO[] {};
}
}
private OAuth2ConfigDTO buildConfigFromRegistration(ClientRegistration registration) {
return new OAuth2ConfigDTO(registration);
return oauth2ClientRegistrationRepositories.getPublicRegistrations();
}
}
......@@ -2,6 +2,7 @@ package at.ac.uibk.gitsearch.web.rest;
import at.ac.uibk.gitsearch.service.dto.OAuth2ConfigDTO;
import at.ac.uibk.gitsearch.service.oauth2.OAuth2ConfigService;
import javax.ws.rs.ServiceUnavailableException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
......@@ -29,6 +30,10 @@ public class OAuth2ConfigResource {
@GetMapping("/allConfigs")
public ResponseEntity<OAuth2ConfigDTO[]> getOAuth2Configs() {
return new ResponseEntity<>(oAuth2ConfigService.getPublicRegistrations(), HttpStatus.OK);
try {
return new ResponseEntity<>(oAuth2ConfigService.getPublicRegistrations(), HttpStatus.OK);
} catch (ServiceUnavailableException e) {
return new ResponseEntity<OAuth2ConfigDTO[]>(HttpStatus.SERVICE_UNAVAILABLE);
}
}
}