我正在使用带有Java的keycloak身份验证。 keycloak java适配器会在令牌无效等情况下引发异常。现在,我想捕获这些异常,以便可以显示自定义消息并执行其他操作。 在下面的示例中,我尝试通过创建过滤器来捕获异常,但未成功。
例如:
调试跟踪:
在以下跟踪中,AuthentciatedActionHandler.isAuthorised
方法在令牌无效的情况下引发异常。
我认为可能会添加带有Priority(1)的过滤器,从而将过滤器引入堆栈中的某个位置,并且我可以处理过滤器中keycloak引发的异常。但是如您所见,过滤器不会出现在堆栈调用中。
(尽管在有效请求的情况下,AuthMasterFilter会出现在堆栈跟踪中)
我的码头配置:
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS | ServletContextHandler.SECURITY ); //keycloak
context.setContextPath("/");
context.addFilter(GzipFilter.class, "/*", EnumSet.allOf(DispatcherType.class));
context.addFilter(AuthMasterFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); // filter to handle exceptions from keycloak
ResourceConfig resourceConfig = new ResourceConfig(ImmutableSet.<Class<?>>builder().add(KeycloakRestService.class).build());
context.addServlet(new ServletHolder(new ServletContainer(resourceConfig)), "/*");
KeycloakJettyAuthenticator kcAuthenticator = ... // set up keycloak
ConstraintSecurityHandler securityHandler = new ConstraintSecurityHandler();
securityHandler.setAuthenticator(kcAuthenticator);
context.setSecurityHandler(securityHandler);
AUTHMASTERFILTER.java:
@Priority(1)
public class AuthMasterFilter implements Filter{
@Override
public void destroy() { }
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
throws IOException, ServletException {
System.out.println("Master called");
}
@Override
public void init(FilterConfig arg0) throws ServletException {}
}