Я использую аутентификацию keycloak с Java.Java-адаптер keycloak генерирует исключения в случае некорректных токенов и т. Д. Теперь я хочу перехватить эти исключения, чтобы я мог показывать пользовательское сообщение и выполнять другие действия. В приведенном ниже примере я пытался перехватить исключения, создав фильтр, но безуспешно.
Например:
TRACE DEBUG: В следующей трассировке, AuthentciatedActionHandler.isAuthorised
метод генерирует исключение в случае неверного токена.
Я думал, что добавление фильтра с приоритетом (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 {}
}