Skip to content

Commit

Permalink
Refactor Config and JaxRsContext injection
Browse files Browse the repository at this point in the history
- Introduce JaxRsConfig for extra configurations for the SecurityFilter
- Add more null checks
  • Loading branch information
victornoel committed Mar 11, 2017
1 parent 57955ed commit 08e40de
Show file tree
Hide file tree
Showing 20 changed files with 182 additions and 126 deletions.
27 changes: 27 additions & 0 deletions src/main/java/org/pac4j/jax/rs/features/JaxRsConfigProvider.java
Original file line number Diff line number Diff line change
@@ -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<Config> {

private final Config config;

public JaxRsConfigProvider(Config config) {
this.config = config;
}

@Override
public Config getContext(Class<?> type) {
return config;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*
Expand All @@ -25,24 +27,24 @@
public class JaxRsContextFactoryProvider implements ContextResolver<JaxRsContextFactory> {

@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);
}

}
33 changes: 11 additions & 22 deletions src/main/java/org/pac4j/jax/rs/features/Pac4JSecurityFeature.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 &#64;Pac4JSecurity}, {@link Pac4JCallback &#64;Pac4JCallback} and
* Injects {@link SecurityFilter}s, {@link CallbackFilter}s and {@link LogoutFilter}s on JAX-RS resources methods
* annotated with {@link Pac4JSecurity &#64;Pac4JSecurity}, {@link Pac4JCallback &#64;Pac4JCallback} and
* {@link Pac4JLogout &#64;Pac4JLogout}.
*
* @author Victor Noel - Linagora
Expand All @@ -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;
Expand Down Expand Up @@ -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());
}
Expand Down Expand Up @@ -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]);
Expand Down Expand Up @@ -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]);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
Expand All @@ -25,8 +24,6 @@ public class Pac4JSecurityFilterFeature implements Feature {

@Context
private Providers providers;

private final Config config;

private final Boolean skipResponse;

Expand All @@ -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;
Expand All @@ -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);
Expand Down
28 changes: 12 additions & 16 deletions src/main/java/org/pac4j/jax/rs/filters/AbstractFilter.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
Expand All @@ -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<JaxRsContextFactory> 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);
}
Expand All @@ -52,11 +48,11 @@ public void filter(ContainerRequestContext requestContext) throws IOException {
*
* @return an {@link HttpActionAdapter}
*/
protected HttpActionAdapter<Object, JaxRsContext> adapter() {
protected HttpActionAdapter<Object, JaxRsContext> 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;
}
Expand Down
9 changes: 6 additions & 3 deletions src/main/java/org/pac4j/jax/rs/filters/CallbackFilter.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<Object, JaxRsContext> cl;

if (callbackLogic != null) {
Expand All @@ -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<Object, JaxRsContext> getCallbackLogic() {
Expand Down
28 changes: 15 additions & 13 deletions src/main/java/org/pac4j/jax/rs/filters/LogoutFilter.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,26 +26,28 @@ public class LogoutFilter extends AbstractFilter {
static {
DEFAULT_LOGIC.setProfileManagerFactory(JaxRsProfileManager::new);
}

private LogoutLogic<Object, JaxRsContext> 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<Object, JaxRsContext> ll;

if (logoutLogic != null) {
Expand All @@ -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);
}

Expand All @@ -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;
}
Expand Down
Loading

0 comments on commit 08e40de

Please sign in to comment.