Hello everyone,
I am trying to customize CAS client IP address obtaining process, for example, try get IP
address from custom HTTP header "X-IP", if not found then try "X-Forwarded-For", finally
use underlying TCP/IP connection address (aka. request.getRemoteAddr()).
I extended ClientInfo class to acheive the target I talked above, next step is to set instance
of CustomizedClientInfo to ClientInfoHolder in the filter. I found the FilterRegistrationBean
of ClientInfoThreadLocalFilter in org.apereo.cas.audit.spi.config.CasCoreAuditConfiguration,
but there is no ConditionalOnMissingBean annotation on it, thus I cannot prevent it from
registering the ClientInfoThreadLocalFilter.
Now I am thinking about another way to solve the problem. I want to hijack the doFilter method
of ClientInfoThreadLocalFilter in AOP, like this:
@Aspect
public class ClientInfoThreadLocalFilterAspect {
@Around("execution(* org.apereo.inspektr.common.web.ClientInfoThreadLocalFilter.doFilter(..))")
public Object hijackClientInfoGeneration(ProceedingJoinPoint joinPoint) throws Throwable {
final Object[] args = joinPoint.getArgs();
Assert.isTrue(args.length == 3, "");
final ServletRequest request = (ServletRequest) args[0];
final ServletResponse response = (ServletResponse) args[1];
final FilterChain filterChain = (FilterChain) args[2];
try {
final ClientInfo clientInfo = new CustomizedClientInfo((HttpServletRequest) request);
ClientInfoHolder.setClientInfo(clientInfo);
filterChain.doFilter(request, response);
} finally {
ClientInfoHolder.clear();
}
return null;
}
}
And I instantiate it in my configuration class:
@EnableAspectJAutoProxy
@Configuration
public class CustomizedCasAuditConfiguration implements AuditTrailExecutionPlanConfigurer {
@Bean
public ClientInfoThreadLocalFilterAspect clientInfoThreadLocalFilterAspect() {
return new ClientInfoThreadLocalFilterAspect();
}
}
I am sure this configuration class is used by spring, because I have another bean in this
class which works normally. Then Set a breakpoint in the first line of hijackClientInfoGeneration
and run in debug mode, send a request, but nothing happened. I have tried to add spring-boot-starter-aop
in build.gradle but nothing different happens.
Is there any trick I forgot when using AOP in cas-overlay?
By the way, I want to submit a patch to make this filter easier to cusomtize, will that be accept
by the maintainer?
James