Nano Hash - криптовалюты, майнинг, программирование

Как интегрировать waffle NegotiateSecurityFilter spring-security со встроенным причалом sparkjava?

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

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

Согласно документации по waffle и нескольким онлайн-ресурсам, включая stackoverflow, требуется 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» во время запуска сервера.

Пожалуйста, дайте мне знать решение в этом сценарии, если вы успешно интегрировали Spring-Security DelegatingFilterProxy со встроенными причалами и sparkjava (без использования 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");
}
26.12.2017
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..