package com.github.hburgmeier.jerseyoauth2.rs.impl.filter; import java.util.LinkedList; import java.util.List; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.ext.Providers; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.github.hburgmeier.jerseyoauth2.api.protocol.IRequestFactory; import com.github.hburgmeier.jerseyoauth2.rs.api.IRSConfiguration; import com.github.hburgmeier.jerseyoauth2.rs.api.annotations.AllowedScopes; import com.github.hburgmeier.jerseyoauth2.rs.api.annotations.OAuth20; import com.github.hburgmeier.jerseyoauth2.rs.api.token.IAccessTokenVerifier; import com.sun.jersey.api.model.AbstractMethod; import com.sun.jersey.api.model.AbstractResourceMethod; import com.sun.jersey.spi.container.ResourceFilter; import com.sun.jersey.spi.container.ResourceFilterFactory; public class OAuth20FilterFactory implements ResourceFilterFactory { private static final Logger LOGGER = LoggerFactory.getLogger(OAuth20FilterFactory.class); @Context private Providers providers; @Override public List<ResourceFilter> create(AbstractMethod am) { if (am instanceof AbstractResourceMethod) { OAuth20 oauth20 = am.getAnnotation(OAuth20.class); AllowedScopes scopes = am.getAnnotation(AllowedScopes.class); if (oauth20!=null) { LOGGER.debug("Installing oauth2 filter on {}", am.getResource()); return getFilters(scopes); } else { oauth20 = am.getResource().getAnnotation(OAuth20.class); scopes = am.getResource().getAnnotation(AllowedScopes.class); if (oauth20!=null) { LOGGER.debug("Installing oauth2 filter on {}", am.getResource()); return getFilters(scopes); } return null; } } else return null; } protected List<ResourceFilter> getFilters(AllowedScopes scopes) { List<ResourceFilter> securityFilters = new LinkedList<ResourceFilter>(); OAuth20AuthenticationFilter oAuth20AuthenticationFilter = new OAuth20AuthenticationFilter(getAccessTokenVerifier(), getRSConfiguration(), getRequestFactory()); if (scopes!=null && scopes.scopes().length>0) { LOGGER.debug("Installing scope filter"); oAuth20AuthenticationFilter.setRequiredScopes(scopes.scopes()); } securityFilters.add(oAuth20AuthenticationFilter); return securityFilters; } protected IRequestFactory getRequestFactory() { return providers.getContextResolver(IRequestFactory.class, MediaType.WILDCARD_TYPE).getContext(IRequestFactory.class); } protected IAccessTokenVerifier getAccessTokenVerifier() { return providers.getContextResolver(IAccessTokenVerifier.class, MediaType.WILDCARD_TYPE).getContext(IAccessTokenVerifier.class); } protected IRSConfiguration getRSConfiguration() { return providers.getContextResolver(IRSConfiguration.class, MediaType.WILDCARD_TYPE).getContext(IRSConfiguration.class); } }