I created simple filter:
Code:
import org.springframework.http.client.support.HttpRequestWrapper;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.filter.GenericFilterBean;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class APIKeyFilter extends GenericFilterBean{
private final Pattern pattern;
public APIKeyFilter(String urlPattern) {
pattern = Pattern.compile(urlPattern);
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest servletRequest = (HttpServletRequest) request;
final String requestPath = servletRequest.getPathInfo();
Matcher matcher = pattern.matcher(requestPath);
if (matcher.find()) {
String apiKey = matcher.group(1);
SecurityContextHolder.getContext().setAuthentication(new APIKey(apiKey));
final int end = matcher.end(1);
request = new HttpServletRequestWrapper(servletRequest) {
@Override
public String getPathInfo() {
String s = requestPath.substring(end);
return s;
}
};
}
chain.doFilter(request,response);
}
}
and injected it into Spring configuration:
Code:
<bean name="apiKeyFilter" class="APIKeyFilter">
<constructor-arg value="^/([^\\/]+)/service/"/>
</bean>
<security:http auto-config='true'>
<security:http-basic/>
<security:custom-filter ref="apiKeyFilter" before="BASIC_AUTH_FILTER"/>
<security:intercept-url pattern="/**/service/**" access="ROLE_CUSTOMER"/>
</security:http>
At this point filter is called and request is replaced with new one, but later on I am getting 404 error because there is no such URL. What may be wrong here? The url supposed to be replaced with new one (and the one without additional api key is working for sure)