Как обрабатывать исключения, генерируемые keycloak в Java? - PullRequest
0 голосов
/ 27 сентября 2018

Я использую аутентификацию keycloak с Java.Java-адаптер keycloak генерирует исключения в случае некорректных токенов и т. Д. Теперь я хочу перехватить эти исключения, чтобы я мог показывать пользовательское сообщение и выполнять другие действия. В приведенном ниже примере я пытался перехватить исключения, создав фильтр, но безуспешно.

Например:

TRACE DEBUG: В следующей трассировке, AuthentciatedActionHandler.isAuthorised метод генерирует исключение в случае неверного токена.

enter image description here

Я думал, что добавление фильтра с приоритетом (1) представитфильтр где-то в стеке, и я могу обрабатывать исключения, выдаваемые keycloak в фильтре.Но, как вы можете видеть, фильтр не приходит при вызове стека.

(хотя в случае действительного запроса AuthMasterFilter входит в трассировку стека)

MyКонфигурация Jetty:

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 {}

}
...