Как интегрировать пружинную защиту NegotiateSecurityFilter для вафель с встраиваемой пристанью sparkjava?

Наше приложение использует sparkjava http://sparkjava.com/ в качестве инфраструктуры REST. Сервер Jetty встроен в приложение (по умолчанию в sparkjava). Мы также используем пружину для внедрения зависимостей.

Для обеспечения аутентификации AD нам нужно интегрировать NegotiateSecurityFilter вафли.

Согласно вафельной документации и нескольким онлайн-ресурсам, включая stackru, требуется DelegatingFilterProxy с именем springSecurityFilterChain.

Но так как мы не используем Spring MVC, я должен добавить его следующим образом:

    ServletContextHandler sparkContext = new ServletContextHandler(ServletContextHandler.SESSIONS);
    sparkContext.addFilter(new FilterHolder( new DelegatingFilterProxy( "springSecurityFilterChain" ) ),"/*", EnumSet.allOf( DispatcherType.class ));

А так как ContextLoaderListener еще не существует, необходимо добавить следующим образом:

    sparkContext.addEventListener( new ContextLoaderListener() );

Но он выдает ошибку "Невозможно инициализировать контекст, потому что уже есть корневой контекст приложения - проверьте, есть ли у вас несколько ContextLoader" во время запуска сервера.

Пожалуйста, дайте мне знать решение в этом сценарии, если вы успешно интегрировали DelegatingFilterProxy с пружинной защитой со встроенным молом и спаркджавой (без использования Spring MVC).

1 ответ

Вот как я наконец достиг этого:

В основном методе, где у меня есть доступ к sparkContext:

ServletContextHandler sparkContext = new  ServletContextHandler(ServletContextHandler.SESSIONS);
sparkContext.setContextPath("/");
sparkContext.addServlet(DefaultServlet.class, "/*");

addSPNEGOFilter(sparkContext);

И методы реализации таковы:

private void addSPNEGOFilter(ServletContextHandler sparkContext) {
    final ServletHandler handler = new ServletHandler();
    final FilterHolder fh = handler.addFilterWithMapping(NegotiateSecurityFilter.class, <SPNEGO_FILTER_PATH>,
            EnumSet.allOf(DispatcherType.class));
    setNegotiateFilterParams(fh);
    sparkContext.addFilter(fh, <SPNEGO_FILTER_PATH>, EnumSet.allOf(DispatcherType.class));
}

Добавьте следующие свойства для владельца:

private static void setNegotiateFilterParams(final FilterHolder fh) {
    fh.setInitParameter("principalFormat", "fqn");
    fh.setInitParameter("roleFormat", "both");

    fh.setInitParameter("allowGuestLogin", "false");
    fh.setInitParameter("impersonate", "false");

    fh.setInitParameter("securityFilterProviders",
            "waffle.servlet.spi.NegotiateSecurityFilterProvider");
    fh.setInitParameter("waffle.servlet.spi.NegotiateSecurityFilterProvider/protocols", "Negotiate");
}
Другие вопросы по тегам