From 08e40de83b720a10ec7d3918113736af7910f4b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Victor=20No=C3=ABl?= Date: Sat, 11 Mar 2017 16:22:54 +0100 Subject: [PATCH] Refactor Config and JaxRsContext injection - Introduce JaxRsConfig for extra configurations for the SecurityFilter - Add more null checks --- .../jax/rs/features/JaxRsConfigProvider.java | 27 +++++++++++++++ .../features/JaxRsContextFactoryProvider.java | 26 ++++++++------- .../jax/rs/features/Pac4JSecurityFeature.java | 33 +++++++------------ .../features/Pac4JSecurityFilterFeature.java | 14 +++----- .../pac4j/jax/rs/filters/AbstractFilter.java | 28 +++++++--------- .../pac4j/jax/rs/filters/CallbackFilter.java | 9 +++-- .../pac4j/jax/rs/filters/LogoutFilter.java | 28 ++++++++-------- .../pac4j/jax/rs/filters/SecurityFilter.java | 23 +++++++++++-- .../GrizzlyJaxRsContextFactoryProvider.java | 7 +--- .../AnnotationsHelper.java | 4 +-- .../pac4j/jax/rs/helpers/ProvidersHelper.java | 25 ++++++++++++++ .../features/Pac4JValueFactoryProvider.java | 20 ++++------- .../org/pac4j/jax/rs/pac4j/JaxRsConfig.java | 16 +++++++++ ...UrlResolver.java => JaxRsUrlResolver.java} | 0 .../ServletJaxRsContextFactoryProvider.java | 8 +---- .../java/org/pac4j/jax/rs/AbstractTest.java | 5 ++- .../jax/rs/JerseyGrizzlyServletTest.java | 8 ++--- .../org/pac4j/jax/rs/JerseyGrizzlyTest.java | 9 +++-- .../org/pac4j/jax/rs/JerseyInMemoryTest.java | 9 +++-- .../jax/rs/RestEasyUndertowServletTest.java | 9 ++--- 20 files changed, 182 insertions(+), 126 deletions(-) create mode 100644 src/main/java/org/pac4j/jax/rs/features/JaxRsConfigProvider.java rename src/main/java/org/pac4j/jax/rs/{features => helpers}/AnnotationsHelper.java (98%) create mode 100644 src/main/java/org/pac4j/jax/rs/helpers/ProvidersHelper.java create mode 100644 src/main/java/org/pac4j/jax/rs/pac4j/JaxRsConfig.java rename src/main/java/org/pac4j/jax/rs/pac4j/{JaxRsCallbackUrlResolver.java => JaxRsUrlResolver.java} (100%) diff --git a/src/main/java/org/pac4j/jax/rs/features/JaxRsConfigProvider.java b/src/main/java/org/pac4j/jax/rs/features/JaxRsConfigProvider.java new file mode 100644 index 0000000..d4b0d04 --- /dev/null +++ b/src/main/java/org/pac4j/jax/rs/features/JaxRsConfigProvider.java @@ -0,0 +1,27 @@ +package org.pac4j.jax.rs.features; + +import javax.ws.rs.ext.ContextResolver; + +import org.pac4j.core.config.Config; + +/** + * + * This class can be used to inject the pac4j {@link Config} in the JAX-RS runtime. + * + * @author Victor Noel - Linagora + * @since 2.0.0 + */ +public class JaxRsConfigProvider implements ContextResolver { + + private final Config config; + + public JaxRsConfigProvider(Config config) { + this.config = config; + } + + @Override + public Config getContext(Class type) { + return config; + } + +} diff --git a/src/main/java/org/pac4j/jax/rs/features/JaxRsContextFactoryProvider.java b/src/main/java/org/pac4j/jax/rs/features/JaxRsContextFactoryProvider.java index fac3371..29c18cd 100644 --- a/src/main/java/org/pac4j/jax/rs/features/JaxRsContextFactoryProvider.java +++ b/src/main/java/org/pac4j/jax/rs/features/JaxRsContextFactoryProvider.java @@ -5,16 +5,18 @@ import javax.ws.rs.ext.ContextResolver; import javax.ws.rs.ext.Providers; +import org.pac4j.core.client.IndirectClient; import org.pac4j.core.config.Config; import org.pac4j.jax.rs.features.JaxRsContextFactoryProvider.JaxRsContextFactory; +import org.pac4j.jax.rs.helpers.ProvidersHelper; import org.pac4j.jax.rs.pac4j.JaxRsContext; /** * * This provides to the JAX-RS runtime a way to build a {@link JaxRsContext} adequate for the container. * - * This is the generic implementation and will not support session management (and hence won't support pac4j indirect - * clients). + * This is the generic implementation and will not support session management (and hence won't support pac4j + * {@link IndirectClient}). * * This can be subclassed for specific containers. * @@ -25,24 +27,24 @@ public class JaxRsContextFactoryProvider implements ContextResolver { @Context - protected Providers providers; - - protected final Config config; - - public JaxRsContextFactoryProvider(Config config) { - assert config != null; - this.config = config; - } + private Providers providers; @Override public JaxRsContextFactory getContext(Class type) { + return context -> new JaxRsContext(getProviders(), context, getConfig().getSessionStore()); + } + + protected Providers getProviders() { assert providers != null; - return context -> new JaxRsContext(providers, context, config.getSessionStore()); + return providers; + } + + protected Config getConfig() { + return ProvidersHelper.getContext(providers, Config.class); } @FunctionalInterface public interface JaxRsContextFactory { JaxRsContext provides(ContainerRequestContext context); } - } diff --git a/src/main/java/org/pac4j/jax/rs/features/Pac4JSecurityFeature.java b/src/main/java/org/pac4j/jax/rs/features/Pac4JSecurityFeature.java index 0b90dec..92e2242 100644 --- a/src/main/java/org/pac4j/jax/rs/features/Pac4JSecurityFeature.java +++ b/src/main/java/org/pac4j/jax/rs/features/Pac4JSecurityFeature.java @@ -10,18 +10,18 @@ import javax.ws.rs.core.FeatureContext; import javax.ws.rs.ext.Providers; -import org.pac4j.core.config.Config; import org.pac4j.jax.rs.annotations.Pac4JCallback; import org.pac4j.jax.rs.annotations.Pac4JLogout; import org.pac4j.jax.rs.annotations.Pac4JSecurity; -import org.pac4j.jax.rs.filters.LogoutFilter; import org.pac4j.jax.rs.filters.CallbackFilter; +import org.pac4j.jax.rs.filters.LogoutFilter; import org.pac4j.jax.rs.filters.SecurityFilter; +import org.pac4j.jax.rs.helpers.AnnotationsHelper; /** * - * Injects {@link SecurityFilter}s, {@link CallbackFilter}s and {@link LogoutFilter}s on JAX-RS resources - * methods annotated with {@link Pac4JSecurity @Pac4JSecurity}, {@link Pac4JCallback @Pac4JCallback} and + * Injects {@link SecurityFilter}s, {@link CallbackFilter}s and {@link LogoutFilter}s on JAX-RS resources methods + * annotated with {@link Pac4JSecurity @Pac4JSecurity}, {@link Pac4JCallback @Pac4JCallback} and * {@link Pac4JLogout @Pac4JLogout}. * * @author Victor Noel - Linagora @@ -37,19 +37,6 @@ public class Pac4JSecurityFeature implements DynamicFeature, Feature { @Context private Providers providers; - private final Config config; - - private String defaultClients = null; - - public Pac4JSecurityFeature(Config config) { - this.config = config; - } - - public Pac4JSecurityFeature(Config config, String defaultClients) { - this.config = config; - this.defaultClients = defaultClients; - } - @Override public void configure(ResourceInfo resourceInfo, FeatureContext context) { assert resourceInfo != null; @@ -83,11 +70,13 @@ public void configure(ResourceInfo resourceInfo, FeatureContext context) { "skipResponse parameter in @Pac4JSecurity is not expected to have more than one value"); } - final SecurityFilter filter = new SecurityFilter(providers, config); + final SecurityFilter filter = new SecurityFilter(providers); + // if there is no clients specified, it is not the same as "" + // no clients will exploit JaxRsConfig.getDefaultClients() String clients; - if (defaultClients != null && secAnn.clients().length == 0) { - clients = defaultClients; + if (secAnn.clients().length == 0) { + clients = null; } else { clients = String.join(",", secAnn.clients()); } @@ -126,7 +115,7 @@ public void configure(ResourceInfo resourceInfo, FeatureContext context) { "skipResponse parameter in @Pac4JCallback is not expected to have more than one value"); } - final CallbackFilter filter = new CallbackFilter(providers, config); + final CallbackFilter filter = new CallbackFilter(providers); filter.setMultiProfile(cbAnn.multiProfile().length == 0 ? null : cbAnn.multiProfile()[0]); filter.setRenewSession(cbAnn.renewSession().length == 0 ? null : cbAnn.renewSession()[0]); @@ -156,7 +145,7 @@ public void configure(ResourceInfo resourceInfo, FeatureContext context) { "skipResponse parameter in @Pac4JLogout is not expected to have more than one value"); } - final LogoutFilter filter = new LogoutFilter(providers, config); + final LogoutFilter filter = new LogoutFilter(providers); filter.setDefaultUrl(lAnn.defaultUrl().length == 0 ? null : lAnn.defaultUrl()[0]); filter.setLogoutUrlPattern(lAnn.logoutUrlPattern().length == 0 ? null : lAnn.logoutUrlPattern()[0]); diff --git a/src/main/java/org/pac4j/jax/rs/features/Pac4JSecurityFilterFeature.java b/src/main/java/org/pac4j/jax/rs/features/Pac4JSecurityFilterFeature.java index 6abe2ad..e76d088 100644 --- a/src/main/java/org/pac4j/jax/rs/features/Pac4JSecurityFilterFeature.java +++ b/src/main/java/org/pac4j/jax/rs/features/Pac4JSecurityFilterFeature.java @@ -5,7 +5,6 @@ import javax.ws.rs.core.FeatureContext; import javax.ws.rs.ext.Providers; -import org.pac4j.core.config.Config; import org.pac4j.jax.rs.filters.SecurityFilter; /** @@ -25,8 +24,6 @@ public class Pac4JSecurityFilterFeature implements Feature { @Context private Providers providers; - - private final Config config; private final Boolean skipResponse; @@ -38,13 +35,12 @@ public class Pac4JSecurityFilterFeature implements Feature { private final Boolean multiProfile; - public Pac4JSecurityFilterFeature(Config config) { - this(config, null, null, null, null, null); + public Pac4JSecurityFilterFeature() { + this(null, null, null, null, null); } - public Pac4JSecurityFilterFeature(Config config, Boolean skipResponse, String authorizers, String clients, - String matchers, Boolean multiProfile) { - this.config = config; + public Pac4JSecurityFilterFeature(Boolean skipResponse, String authorizers, String clients, String matchers, + Boolean multiProfile) { this.skipResponse = skipResponse; this.authorizers = authorizers; this.clients = clients; @@ -54,7 +50,7 @@ public Pac4JSecurityFilterFeature(Config config, Boolean skipResponse, String au @Override public boolean configure(FeatureContext context) { - final SecurityFilter filter = new SecurityFilter(providers, config); + final SecurityFilter filter = new SecurityFilter(providers); filter.setAuthorizers(authorizers); filter.setClients(clients); filter.setMatchers(matchers); diff --git a/src/main/java/org/pac4j/jax/rs/filters/AbstractFilter.java b/src/main/java/org/pac4j/jax/rs/filters/AbstractFilter.java index 0f3ca49..a356727 100644 --- a/src/main/java/org/pac4j/jax/rs/filters/AbstractFilter.java +++ b/src/main/java/org/pac4j/jax/rs/filters/AbstractFilter.java @@ -4,14 +4,12 @@ import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerRequestFilter; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.ext.ContextResolver; import javax.ws.rs.ext.Providers; import org.pac4j.core.config.Config; import org.pac4j.core.http.HttpActionAdapter; -import org.pac4j.core.util.CommonHelper; import org.pac4j.jax.rs.features.JaxRsContextFactoryProvider.JaxRsContextFactory; +import org.pac4j.jax.rs.helpers.ProvidersHelper; import org.pac4j.jax.rs.pac4j.JaxRsContext; /** @@ -24,25 +22,23 @@ public abstract class AbstractFilter implements ContainerRequestFilter { protected Boolean skipResponse; - protected final Config config; - private final Providers providers; - public AbstractFilter(Providers providers, Config config) { + public AbstractFilter(Providers providers) { this.providers = providers; - this.config = config; + } + + protected Config getConfig() { + return ProvidersHelper.getContext(providers, Config.class); } protected abstract void filter(JaxRsContext context) throws IOException; @Override public void filter(ContainerRequestContext requestContext) throws IOException { - ContextResolver contextResolver = providers.getContextResolver(JaxRsContextFactory.class, - MediaType.WILDCARD_TYPE); - JaxRsContextFactory contextFactory = contextResolver.getContext(JaxRsContextFactory.class); - JaxRsContext context = contextFactory.provides(requestContext); - - CommonHelper.assertNotNull("contextProvider", context); + JaxRsContext context = ProvidersHelper.getContext(providers, JaxRsContextFactory.class) + .provides(requestContext); + assert context != null; filter(context); } @@ -52,11 +48,11 @@ public void filter(ContainerRequestContext requestContext) throws IOException { * * @return an {@link HttpActionAdapter} */ - protected HttpActionAdapter adapter() { + protected HttpActionAdapter adapter(Config config) { final HttpActionAdapter adapter; - if (this.config.getHttpActionAdapter() != null) { - adapter = this.config.getHttpActionAdapter(); + if (config.getHttpActionAdapter() != null) { + adapter = config.getHttpActionAdapter(); } else { adapter = JaxRsHttpActionAdapter.INSTANCE; } diff --git a/src/main/java/org/pac4j/jax/rs/filters/CallbackFilter.java b/src/main/java/org/pac4j/jax/rs/filters/CallbackFilter.java index dc5bcb1..8b79988 100644 --- a/src/main/java/org/pac4j/jax/rs/filters/CallbackFilter.java +++ b/src/main/java/org/pac4j/jax/rs/filters/CallbackFilter.java @@ -35,13 +35,15 @@ public class CallbackFilter extends AbstractFilter { private Boolean renewSession; - public CallbackFilter(Providers providers, Config config) { - super(providers, config); + public CallbackFilter(Providers providers) { + super(providers); } @Override protected void filter(JaxRsContext context) throws IOException { + Config config = getConfig(); + CallbackLogic cl; if (callbackLogic != null) { @@ -52,7 +54,8 @@ protected void filter(JaxRsContext context) throws IOException { cl = DEFAULT_LOGIC; } - cl.perform(context, config, adapter(), context.getAbsolutePath(defaultUrl, false), multiProfile, renewSession); + cl.perform(context, config, adapter(config), context.getAbsolutePath(defaultUrl, false), multiProfile, + renewSession); } public CallbackLogic getCallbackLogic() { diff --git a/src/main/java/org/pac4j/jax/rs/filters/LogoutFilter.java b/src/main/java/org/pac4j/jax/rs/filters/LogoutFilter.java index 1f8f014..a98ba1e 100644 --- a/src/main/java/org/pac4j/jax/rs/filters/LogoutFilter.java +++ b/src/main/java/org/pac4j/jax/rs/filters/LogoutFilter.java @@ -26,26 +26,28 @@ public class LogoutFilter extends AbstractFilter { static { DEFAULT_LOGIC.setProfileManagerFactory(JaxRsProfileManager::new); } - + private LogoutLogic logoutLogic; private String defaultUrl; private String logoutUrlPattern; - + private Boolean localLogout; - + private Boolean destroySession; - + private Boolean centralLogout; - public LogoutFilter(Providers providers, Config config) { - super(providers, config); + public LogoutFilter(Providers providers) { + super(providers); } @Override protected void filter(JaxRsContext context) throws IOException { + Config config = getConfig(); + LogoutLogic ll; if (logoutLogic != null) { @@ -56,7 +58,7 @@ protected void filter(JaxRsContext context) throws IOException { ll = DEFAULT_LOGIC; } - ll.perform(context, config, adapter(), context.getAbsolutePath(defaultUrl, false), + ll.perform(context, config, adapter(config), context.getAbsolutePath(defaultUrl, false), context.getAbsolutePath(logoutUrlPattern, false), localLogout, destroySession, centralLogout); } @@ -75,27 +77,27 @@ public String getLogoutUrlPattern() { public void setLogoutUrlPattern(String logoutUrlPattern) { this.logoutUrlPattern = logoutUrlPattern; } - + public Boolean getLocalLogout() { return localLogout; } - + public void setLocalLogout(Boolean localLogout) { this.localLogout = localLogout; } - + public Boolean getDestroySession() { return destroySession; } - + public void setDestroySession(Boolean destroySession) { this.destroySession = destroySession; } - + public Boolean getCentralLogout() { return centralLogout; } - + public void setCentralLogout(Boolean centralLogout) { this.centralLogout = centralLogout; } diff --git a/src/main/java/org/pac4j/jax/rs/filters/SecurityFilter.java b/src/main/java/org/pac4j/jax/rs/filters/SecurityFilter.java index 0a2c18e..f839cfa 100644 --- a/src/main/java/org/pac4j/jax/rs/filters/SecurityFilter.java +++ b/src/main/java/org/pac4j/jax/rs/filters/SecurityFilter.java @@ -10,6 +10,7 @@ import org.pac4j.core.engine.DefaultSecurityLogic; import org.pac4j.core.engine.SecurityGrantedAccessAdapter; import org.pac4j.core.engine.SecurityLogic; +import org.pac4j.jax.rs.pac4j.JaxRsConfig; import org.pac4j.jax.rs.pac4j.JaxRsContext; import org.pac4j.jax.rs.pac4j.JaxRsProfileManager; @@ -41,12 +42,15 @@ public class SecurityFilter extends AbstractFilter { private Boolean multiProfile; - public SecurityFilter(Providers providers, Config config) { - super(providers, config); + public SecurityFilter(Providers providers) { + super(providers); } @Override protected void filter(JaxRsContext context) throws IOException { + + Config config = getConfig(); + SecurityLogic sl; if (securityLogic != null) { @@ -57,11 +61,24 @@ protected void filter(JaxRsContext context) throws IOException { sl = DEFAULT_LOGIC; } + String cs; + // no client was set + if (clients == null && config instanceof JaxRsConfig) { + cs = ((JaxRsConfig) config).getDefaultClients(); + } else { + cs = clients; + } + + if (cs == null) { + // SecurityLogic.perform expects a non-null value + cs = ""; + } + // Note: basically, there is two possible outcomes: // either the access is granted or there was an error or a redirect! // For the former, we do nothing (see SecurityGrantedAccessOutcome comments) // For the later, we interpret the error and abort the request using jax-rs abstractions - sl.perform(context, config, SecurityGrantedAccessOutcome.INSTANCE, adapter(), clients, authorizers, matchers, + sl.perform(context, config, SecurityGrantedAccessOutcome.INSTANCE, adapter(config), cs, authorizers, matchers, multiProfile); } diff --git a/src/main/java/org/pac4j/jax/rs/grizzly/features/GrizzlyJaxRsContextFactoryProvider.java b/src/main/java/org/pac4j/jax/rs/grizzly/features/GrizzlyJaxRsContextFactoryProvider.java index 6dd1441..69190a6 100644 --- a/src/main/java/org/pac4j/jax/rs/grizzly/features/GrizzlyJaxRsContextFactoryProvider.java +++ b/src/main/java/org/pac4j/jax/rs/grizzly/features/GrizzlyJaxRsContextFactoryProvider.java @@ -4,7 +4,6 @@ import javax.inject.Provider; import org.glassfish.grizzly.http.server.Request; -import org.pac4j.core.config.Config; import org.pac4j.jax.rs.features.JaxRsContextFactoryProvider; import org.pac4j.jax.rs.grizzly.pac4j.GrizzlyJaxRsContext; @@ -24,14 +23,10 @@ public class GrizzlyJaxRsContextFactoryProvider extends JaxRsContextFactoryProvi @Inject protected Provider requestProvider; - public GrizzlyJaxRsContextFactoryProvider(Config config) { - super(config); - } - @Override public JaxRsContextFactory getContext(Class type) { Request request = requestProvider.get(); assert request != null; - return context -> new GrizzlyJaxRsContext(providers, context, config.getSessionStore(), request); + return context -> new GrizzlyJaxRsContext(getProviders(), context, getConfig().getSessionStore(), request); } } diff --git a/src/main/java/org/pac4j/jax/rs/features/AnnotationsHelper.java b/src/main/java/org/pac4j/jax/rs/helpers/AnnotationsHelper.java similarity index 98% rename from src/main/java/org/pac4j/jax/rs/features/AnnotationsHelper.java rename to src/main/java/org/pac4j/jax/rs/helpers/AnnotationsHelper.java index e5c44ca..d9ca01a 100644 --- a/src/main/java/org/pac4j/jax/rs/features/AnnotationsHelper.java +++ b/src/main/java/org/pac4j/jax/rs/helpers/AnnotationsHelper.java @@ -1,4 +1,4 @@ -package org.pac4j.jax.rs.features; +package org.pac4j.jax.rs.helpers; import java.lang.annotation.Annotation; import java.lang.reflect.Method; @@ -6,10 +6,8 @@ import java.security.PrivilegedAction; /** - * * @author Victor Noel - Linagora * @since 1.0.1 - * */ public class AnnotationsHelper { diff --git a/src/main/java/org/pac4j/jax/rs/helpers/ProvidersHelper.java b/src/main/java/org/pac4j/jax/rs/helpers/ProvidersHelper.java new file mode 100644 index 0000000..453f9ce --- /dev/null +++ b/src/main/java/org/pac4j/jax/rs/helpers/ProvidersHelper.java @@ -0,0 +1,25 @@ +package org.pac4j.jax.rs.helpers; + +import javax.ws.rs.core.MediaType; +import javax.ws.rs.ext.ContextResolver; +import javax.ws.rs.ext.Providers; + +import org.pac4j.core.util.CommonHelper; + +/** + * @author Victor Noel - Linagora + * @since 2.0.0 + */ +public class ProvidersHelper { + + public ProvidersHelper() { + } + + public static A getContext(Providers providers, Class clazz) { + ContextResolver cr = providers.getContextResolver(clazz, MediaType.WILDCARD_TYPE); + CommonHelper.assertNotNull("ContextResolver<"+clazz.getSimpleName()+">", cr); + A a = cr.getContext(null); + CommonHelper.assertNotNull(clazz.getSimpleName(), a); + return a; + } +} diff --git a/src/main/java/org/pac4j/jax/rs/jersey/features/Pac4JValueFactoryProvider.java b/src/main/java/org/pac4j/jax/rs/jersey/features/Pac4JValueFactoryProvider.java index cad0222..97da1e9 100644 --- a/src/main/java/org/pac4j/jax/rs/jersey/features/Pac4JValueFactoryProvider.java +++ b/src/main/java/org/pac4j/jax/rs/jersey/features/Pac4JValueFactoryProvider.java @@ -5,8 +5,6 @@ import javax.inject.Inject; import javax.inject.Singleton; import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.ext.ContextResolver; import javax.ws.rs.ext.Providers; import org.glassfish.hk2.api.Factory; @@ -25,6 +23,7 @@ import org.pac4j.jax.rs.annotations.Pac4JProfile; import org.pac4j.jax.rs.annotations.Pac4JProfileManager; import org.pac4j.jax.rs.features.JaxRsContextFactoryProvider.JaxRsContextFactory; +import org.pac4j.jax.rs.helpers.ProvidersHelper; import org.pac4j.jax.rs.pac4j.JaxRsContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,7 +37,6 @@ * @since 1.0.0 * */ -@Singleton public class Pac4JValueFactoryProvider { static class Pac4JProfileValueFactoryProvider extends AbstractValueFactoryProvider { @@ -84,14 +82,12 @@ protected Factory createValueFactory(Parameter parameter) { } } - @Singleton static class ProfileManagerInjectionResolver extends ParamInjectionResolver { ProfileManagerInjectionResolver() { super(Pac4JProfileManagerValueFactoryProvider.class); } } - @Singleton static class ProfileInjectionResolver extends ParamInjectionResolver { ProfileInjectionResolver() { super(Pac4JProfileValueFactoryProvider.class); @@ -114,7 +110,7 @@ static class ProfileManagerValueFactory extends AbstractJaxRsContextValueFactory @Override public ProfileManager provide() { - return new ProfileManager<>(getJaxRsContext()); + return new ProfileManager<>(getContext()); } @Override @@ -139,7 +135,7 @@ public ProfileValueFactory(Parameter parameter) { @Override public CommonProfile provide() { final boolean readFromSession = parameter.getAnnotation(Pac4JProfile.class).readFromSession(); - final Optional profile = new ProfileManager<>(getJaxRsContext()).get(readFromSession); + final Optional profile = new ProfileManager<>(getContext()).get(readFromSession); if (profile.isPresent()) { final CommonProfile p = profile.get(); if (parameter.getRawType().isInstance(p)) { @@ -162,17 +158,15 @@ public void dispose(CommonProfile instance) { // nothing } } - + static abstract class AbstractJaxRsContextValueFactory extends AbstractContainerRequestValueFactory { @Context private Providers providers; - protected JaxRsContext getJaxRsContext() { - ContextResolver contextResolver = providers - .getContextResolver(JaxRsContextFactory.class, MediaType.WILDCARD_TYPE); - JaxRsContextFactory contextFactory = contextResolver.getContext(JaxRsContextFactory.class); - JaxRsContext context = contextFactory.provides(getContainerRequest()); + protected JaxRsContext getContext() { + JaxRsContext context = ProvidersHelper.getContext(providers, JaxRsContextFactory.class) + .provides(getContainerRequest()); assert context != null; return context; } diff --git a/src/main/java/org/pac4j/jax/rs/pac4j/JaxRsConfig.java b/src/main/java/org/pac4j/jax/rs/pac4j/JaxRsConfig.java new file mode 100644 index 0000000..7473993 --- /dev/null +++ b/src/main/java/org/pac4j/jax/rs/pac4j/JaxRsConfig.java @@ -0,0 +1,16 @@ +package org.pac4j.jax.rs.pac4j; + +import org.pac4j.core.config.Config; + +public class JaxRsConfig extends Config { + + protected String defaultClients; + + public void setDefaultClients(String defaultClients) { + this.defaultClients = defaultClients; + } + + public String getDefaultClients() { + return defaultClients; + } +} diff --git a/src/main/java/org/pac4j/jax/rs/pac4j/JaxRsCallbackUrlResolver.java b/src/main/java/org/pac4j/jax/rs/pac4j/JaxRsUrlResolver.java similarity index 100% rename from src/main/java/org/pac4j/jax/rs/pac4j/JaxRsCallbackUrlResolver.java rename to src/main/java/org/pac4j/jax/rs/pac4j/JaxRsUrlResolver.java diff --git a/src/main/java/org/pac4j/jax/rs/servlet/features/ServletJaxRsContextFactoryProvider.java b/src/main/java/org/pac4j/jax/rs/servlet/features/ServletJaxRsContextFactoryProvider.java index ff065c8..07fe04a 100644 --- a/src/main/java/org/pac4j/jax/rs/servlet/features/ServletJaxRsContextFactoryProvider.java +++ b/src/main/java/org/pac4j/jax/rs/servlet/features/ServletJaxRsContextFactoryProvider.java @@ -3,7 +3,6 @@ import javax.servlet.http.HttpServletRequest; import javax.ws.rs.core.Context; -import org.pac4j.core.config.Config; import org.pac4j.jax.rs.features.JaxRsContextFactoryProvider; import org.pac4j.jax.rs.servlet.pac4j.ServletJaxRsContext; @@ -21,13 +20,8 @@ public class ServletJaxRsContextFactoryProvider extends JaxRsContextFactoryProvi @Context private HttpServletRequest request; - public ServletJaxRsContextFactoryProvider(Config config) { - super(config); - } - @Override public JaxRsContextFactory getContext(Class type) { - assert request != null; - return context -> new ServletJaxRsContext(providers, context, config.getSessionStore(), request); + return context -> new ServletJaxRsContext(getProviders(), context, getConfig().getSessionStore(), request); } } diff --git a/src/test/java/org/pac4j/jax/rs/AbstractTest.java b/src/test/java/org/pac4j/jax/rs/AbstractTest.java index eb8221b..8b84789 100644 --- a/src/test/java/org/pac4j/jax/rs/AbstractTest.java +++ b/src/test/java/org/pac4j/jax/rs/AbstractTest.java @@ -25,6 +25,7 @@ import org.pac4j.http.client.indirect.FormClient; import org.pac4j.http.credentials.authenticator.test.SimpleTestUsernamePasswordAuthenticator; import org.pac4j.jax.rs.pac4j.JaxRsCallbackUrlResolver; +import org.pac4j.jax.rs.pac4j.JaxRsConfig; import org.slf4j.bridge.SLF4JBridgeHandler; /** @@ -77,7 +78,9 @@ protected Config getConfig() { // so that callback url have the correct prefix w.r.t. the container's context clients.setCallbackUrlResolver(new JaxRsCallbackUrlResolver()); - Config config = new Config(clients); + JaxRsConfig config = new JaxRsConfig(); + config.setClients(clients); + config.setDefaultClients(DEFAULT_CLIENT); return config; } diff --git a/src/test/java/org/pac4j/jax/rs/JerseyGrizzlyServletTest.java b/src/test/java/org/pac4j/jax/rs/JerseyGrizzlyServletTest.java index 5249cd4..095cc79 100644 --- a/src/test/java/org/pac4j/jax/rs/JerseyGrizzlyServletTest.java +++ b/src/test/java/org/pac4j/jax/rs/JerseyGrizzlyServletTest.java @@ -16,7 +16,7 @@ import org.glassfish.jersey.test.spi.TestContainerFactory; import org.junit.After; import org.junit.Before; -import org.pac4j.core.config.Config; +import org.pac4j.jax.rs.features.JaxRsConfigProvider; import org.pac4j.jax.rs.features.Pac4JSecurityFeature; import org.pac4j.jax.rs.jersey.features.Pac4JValueFactoryProvider; import org.pac4j.jax.rs.servlet.features.ServletJaxRsContextFactoryProvider; @@ -50,10 +50,10 @@ protected TestContainerFactory getTestContainerFactory() throws TestContainerExc protected DeploymentContext configureDeployment() { forceSet(TestProperties.CONTAINER_PORT, "0"); - Config config = getConfig(); ResourceConfig app = new ResourceConfig(getResources()) - .register(new ServletJaxRsContextFactoryProvider(config)) - .register(new Pac4JSecurityFeature(config, DEFAULT_CLIENT)) + .register(new JaxRsConfigProvider(getConfig())) + .register(new ServletJaxRsContextFactoryProvider()) + .register(new Pac4JSecurityFeature()) .register(new Pac4JValueFactoryProvider.Binder()); return ServletDeploymentContext.forServlet(new ServletContainer(app)).build(); diff --git a/src/test/java/org/pac4j/jax/rs/JerseyGrizzlyTest.java b/src/test/java/org/pac4j/jax/rs/JerseyGrizzlyTest.java index a644453..6a5f8ca 100644 --- a/src/test/java/org/pac4j/jax/rs/JerseyGrizzlyTest.java +++ b/src/test/java/org/pac4j/jax/rs/JerseyGrizzlyTest.java @@ -14,7 +14,7 @@ import org.glassfish.jersey.test.spi.TestContainerFactory; import org.junit.After; import org.junit.Before; -import org.pac4j.core.config.Config; +import org.pac4j.jax.rs.features.JaxRsConfigProvider; import org.pac4j.jax.rs.features.Pac4JSecurityFeature; import org.pac4j.jax.rs.grizzly.features.GrizzlyJaxRsContextFactoryProvider; import org.pac4j.jax.rs.jersey.features.Pac4JValueFactoryProvider; @@ -49,11 +49,10 @@ protected TestContainerFactory getTestContainerFactory() protected DeploymentContext configureDeployment() { forceSet(TestProperties.CONTAINER_PORT, "0"); - Config config = getConfig(); - ResourceConfig app = new ResourceConfig(getResources()) - .register(new GrizzlyJaxRsContextFactoryProvider(config)) - .register(new Pac4JSecurityFeature(config, DEFAULT_CLIENT)) + .register(new JaxRsConfigProvider(getConfig())) + .register(new GrizzlyJaxRsContextFactoryProvider()) + .register(new Pac4JSecurityFeature()) .register(new Pac4JValueFactoryProvider.Binder()); return DeploymentContext.builder(app).build(); diff --git a/src/test/java/org/pac4j/jax/rs/JerseyInMemoryTest.java b/src/test/java/org/pac4j/jax/rs/JerseyInMemoryTest.java index bae1f03..ac81987 100644 --- a/src/test/java/org/pac4j/jax/rs/JerseyInMemoryTest.java +++ b/src/test/java/org/pac4j/jax/rs/JerseyInMemoryTest.java @@ -12,7 +12,7 @@ import org.glassfish.jersey.test.spi.TestContainerFactory; import org.junit.After; import org.junit.Before; -import org.pac4j.core.config.Config; +import org.pac4j.jax.rs.features.JaxRsConfigProvider; import org.pac4j.jax.rs.features.JaxRsContextFactoryProvider; import org.pac4j.jax.rs.features.Pac4JSecurityFeature; import org.pac4j.jax.rs.jersey.features.Pac4JValueFactoryProvider; @@ -45,11 +45,10 @@ protected TestContainerFactory getTestContainerFactory() @Override protected DeploymentContext configureDeployment() { - Config config = getConfig(); - ResourceConfig app = new ResourceConfig(getResources()) - .register(new JaxRsContextFactoryProvider(config)) - .register(new Pac4JSecurityFeature(config, DEFAULT_CLIENT)) + .register(new JaxRsConfigProvider(getConfig())) + .register(new JaxRsContextFactoryProvider()) + .register(new Pac4JSecurityFeature()) .register(new Pac4JValueFactoryProvider.Binder()); return DeploymentContext.builder(app).build(); diff --git a/src/test/java/org/pac4j/jax/rs/RestEasyUndertowServletTest.java b/src/test/java/org/pac4j/jax/rs/RestEasyUndertowServletTest.java index 55db530..e696a24 100644 --- a/src/test/java/org/pac4j/jax/rs/RestEasyUndertowServletTest.java +++ b/src/test/java/org/pac4j/jax/rs/RestEasyUndertowServletTest.java @@ -12,7 +12,7 @@ import org.junit.After; import org.junit.Before; import org.junit.Ignore; -import org.pac4j.core.config.Config; +import org.pac4j.jax.rs.features.JaxRsConfigProvider; import org.pac4j.jax.rs.features.Pac4JSecurityFeature; import org.pac4j.jax.rs.servlet.features.ServletJaxRsContextFactoryProvider; @@ -36,9 +36,10 @@ public Set> getClasses() { @Override public Set getSingletons() { - final Config config = getConfig(); - return Sets.newLinkedHashSet(new ServletJaxRsContextFactoryProvider(config), - new Pac4JSecurityFeature(config, DEFAULT_CLIENT)); + return Sets.newLinkedHashSet( + new JaxRsConfigProvider(getConfig()), + new ServletJaxRsContextFactoryProvider(), + new Pac4JSecurityFeature()); } }