Skip to content

Instantly share code, notes, and snippets.

@jasondlee
Created May 22, 2019 21:14
Show Gist options
  • Save jasondlee/c5895f1e67b146ba079d1f846d4ee18d to your computer and use it in GitHub Desktop.
Save jasondlee/c5895f1e67b146ba079d1f846d4ee18d to your computer and use it in GitHub Desktop.
diff --git a/security-oauth2/src/main/java/io/micronaut/security/oauth2/configuration/OauthConfiguration.java b/security-oauth2/src/main/java/io/micronaut/security/oauth2/configuration/OauthConfiguration.java
index 7b2f1afd..b40e0dee 100644
--- a/security-oauth2/src/main/java/io/micronaut/security/oauth2/configuration/OauthConfiguration.java
+++ b/security-oauth2/src/main/java/io/micronaut/security/oauth2/configuration/OauthConfiguration.java
@@ -18,6 +18,7 @@ package io.micronaut.security.oauth2.configuration;
import io.micronaut.core.util.Toggleable;
import javax.annotation.Nonnull;
+import java.util.Optional;
/**
* OAuth 2.0 Configuration
@@ -40,6 +41,16 @@ public interface OauthConfiguration extends Toggleable {
@Nonnull
String getCallbackUri();
+ /**
+ * @return the default authorization provider
+ */
+ Optional<String> getDefaultProvider();
+
+ /**
+ * @return Redirect to authentication provider for an unauthorized request
+ */
+ boolean getUnauthorizedRedirect();
+
/**
*
* @return OpenID Connect Configuration
diff --git a/security-oauth2/src/main/java/io/micronaut/security/oauth2/configuration/OauthConfigurationProperties.java b/security-oauth2/src/main/java/io/micronaut/security/oauth2/configuration/OauthConfigurationProperties.java
index 822ef16c..80441df8 100644
--- a/security-oauth2/src/main/java/io/micronaut/security/oauth2/configuration/OauthConfigurationProperties.java
+++ b/security-oauth2/src/main/java/io/micronaut/security/oauth2/configuration/OauthConfigurationProperties.java
@@ -23,6 +23,7 @@ import io.micronaut.security.config.SecurityConfigurationProperties;
import io.micronaut.security.oauth2.configuration.endpoints.EndSessionConfiguration;
import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
import java.util.Optional;
/**
@@ -42,14 +43,16 @@ public class OauthConfigurationProperties implements OauthConfiguration {
*/
@SuppressWarnings("WeakerAccess")
public static final boolean DEFAULT_ENABLED = false;
- private static final String DEFAULT_LOGIN = "/oauth/login/{provider}";
- private static final String DEFAULT_CALLBACK = "/oauth/callback/{provider}";
+ private static final String DEFAULT_LOGIN = "/oauth/login{/provider}";
+ private static final String DEFAULT_CALLBACK = "/oauth/callback{/provider}";
private boolean enabled = DEFAULT_ENABLED;
private String callbackUri = DEFAULT_CALLBACK;
private String loginUri = DEFAULT_LOGIN;
+ private String defaultProvider = null;
private OpenIdConfigurationProperties openid = new OpenIdConfigurationProperties();
+ private boolean unauthorizedRedirect = false;
@Override
public boolean isEnabled() {
@@ -87,6 +90,34 @@ public class OauthConfigurationProperties implements OauthConfiguration {
return callbackUri;
}
+ /**
+ * The default authentication provider for an OAuth 2.0 authorication code grant flow.
+ * @return
+ */
+ public void setDefaultProvider(String defaultProvider) {
+ this.defaultProvider = defaultProvider;
+ }
+
+
+ @Override
+ @Nullable
+ public Optional<String> getDefaultProvider() {
+ return Optional.ofNullable(defaultProvider);
+ }
+
+ /**
+ *
+ * @param unauthorizedRedirect
+ */
+ public void setUnauthorizedRedirect(boolean unauthorizedRedirect) {
+ this.unauthorizedRedirect = unauthorizedRedirect;
+ }
+
+ @Override
+ public boolean getUnauthorizedRedirect() {
+ return unauthorizedRedirect;
+ }
+
/**
* The URI template that OAuth 2.0 providers can use to
* submit an authorization callback request. Default value ({@value #DEFAULT_CALLBACK}).
diff --git a/security-oauth2/src/main/java/io/micronaut/security/oauth2/routes/OauthRouteBuilder.java b/security-oauth2/src/main/java/io/micronaut/security/oauth2/routes/OauthRouteBuilder.java
index 7d0b2e44..e6c02ed5 100644
--- a/security-oauth2/src/main/java/io/micronaut/security/oauth2/routes/OauthRouteBuilder.java
+++ b/security-oauth2/src/main/java/io/micronaut/security/oauth2/routes/OauthRouteBuilder.java
@@ -80,6 +80,7 @@ class OauthRouteBuilder extends DefaultRouteBuilder {
controllerList.forEach((controller) -> {
OauthClient client = controller.getClient();
String name = client.getName();
+ boolean isDefaultProvider = oauthConfiguration.getDefaultProvider().filter(provider -> provider.equals(name)).isPresent();
BeanDefinition<OauthController> bd = beanContext.getBeanDefinition(OauthController.class, Qualifiers.byName(name));
@@ -89,6 +90,13 @@ class OauthRouteBuilder extends DefaultRouteBuilder {
LOG.debug("Registering login route [GET: {}] for oauth configuration [{}]", loginPath, name);
}
buildRoute(HttpMethod.GET, loginPath, ExecutionHandle.of(controller, m));
+ if (isDefaultProvider) {
+ final String defaultLoginPath = oauthRouteUrlBuilder.buildLoginUri(null).getPath();
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Registering default login route [GET: {}] for oauth configuration [{}]", defaultLoginPath, name);
+ }
+ buildRoute(HttpMethod.GET, defaultLoginPath, ExecutionHandle.of(controller, m));
+ }
});
bd.findMethod("callback", HttpRequest.class).ifPresent(m -> {
@@ -100,6 +108,16 @@ class OauthRouteBuilder extends DefaultRouteBuilder {
}
buildRoute(HttpMethod.GET, callbackPath, executionHandle);
buildRoute(HttpMethod.POST, callbackPath, executionHandle).consumes(MediaType.APPLICATION_FORM_URLENCODED_TYPE);
+
+ if (isDefaultProvider) {
+ final String defaultCallbackPath = oauthRouteUrlBuilder.buildCallbackUri(null).getPath();
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Registering default callback route [GET: {}] for oauth configuration [{}]", defaultCallbackPath, name);
+ LOG.debug("Registering default callback route [POST: {}] for oauth configuration [{}]", defaultCallbackPath, name);
+ }
+ buildRoute(HttpMethod.GET, defaultCallbackPath, executionHandle);
+ buildRoute(HttpMethod.POST, defaultCallbackPath, executionHandle).consumes(MediaType.APPLICATION_FORM_URLENCODED_TYPE);
+ }
});
if (client instanceof OpenIdClient) {
diff --git a/security-oauth2/src/main/java/io/micronaut/security/oauth2/url/DefaultOauthRouteUrlBuilder.java b/security-oauth2/src/main/java/io/micronaut/security/oauth2/url/DefaultOauthRouteUrlBuilder.java
index db0f9471..45fa6038 100644
--- a/security-oauth2/src/main/java/io/micronaut/security/oauth2/url/DefaultOauthRouteUrlBuilder.java
+++ b/security-oauth2/src/main/java/io/micronaut/security/oauth2/url/DefaultOauthRouteUrlBuilder.java
@@ -66,7 +66,7 @@ public class DefaultOauthRouteUrlBuilder implements OauthRouteUrlBuilder {
}
@Override
- public URI buildLoginUri(String providerName) {
+ public URI buildLoginUri(@Nullable String providerName) {
try {
return new URI(getPath(loginUriTemplate, providerName));
} catch (URISyntaxException e) {
@@ -75,7 +75,7 @@ public class DefaultOauthRouteUrlBuilder implements OauthRouteUrlBuilder {
}
@Override
- public URI buildCallbackUri(String providerName) {
+ public URI buildCallbackUri(@Nullable String providerName) {
try {
return new URI(getPath(callbackUriTemplate, providerName));
} catch (URISyntaxException e) {
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment