如何处理Java中keycloak引发的异常?

时间:2018-09-27 11:11:56

标签: java jersey jetty jersey-2.0 keycloak

我正在使用带有Java的keycloak身份验证。 keycloak java适配器会在令牌无效等情况下引发异常。现在,我想捕获这些异常,以便可以显示自定义消息并执行其他操作。 在下面的示例中,我尝试通过创建过滤器来捕获异常,但未成功。

例如:

调试跟踪: 在以下跟踪中,AuthentciatedActionHandler.isAuthorised方法在令牌无效的情况下引发异常。

enter image description here

我认为可能会添加带有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 {}

}

0 个答案:

没有答案