【问题标题】:Spring Boot and Spring Security integration in embedded Jetty environment嵌入式 Jetty 环境中的 Spring Boot 和 Spring Security 集成
【发布时间】:2014-07-12 18:06:16
【问题描述】:

我正在尝试从带有 Spring Boot 和嵌入式 Jetty 的“胖”可执行 JAR 中的 main() 方法初始化 Spring Security。 我使用带有 Java 配置的 Spring Security(没有 web.xml)。问题是嵌入式 Jetty 无法注册 springSecurityFilterChain 过滤器。

当我在 Jetty (mvn jetty:run) 中运行与 WAR 相同的 JAR 时,它运行正常,我看到了:

Initializing Spring embedded WebApplicationContext

但是在嵌入式 Jetty 中运行时,我看不到 WebApplicationContext 正在初始化。

我有这个EmbeddedServletContainerFactory

@Bean
public EmbeddedServletContainerFactory servletContainerFactory() {
    JettyEmbeddedServletContainerFactory factory = new JettyEmbeddedServletContainerFactory();
    factory.setPort(8080);
    factory.addServerCustomizers(new JettyServerCustomizer() {
        public void customize(Server server) {    
        // TODO: INITIALIZE SPRING SECURITY SOMEHOW...
        }
    });
    return factory;
}

我尝试创建AbstractSecurityWebApplicationInitializer 的子类,但它与我的SpringBootServletInitializer 冲突。在我的pom.xml 中,我有这些依赖项:

  • spring-boot-starter-jetty
  • spring-boot-starter-logging
  • spring-boot-starter

当我添加 spring-boot-web 时,它会抛出:

java.lang.IllegalArgumentException: A ServletContext is required to configure default servlet handling

我还尝试向 Jetty 注册 DelegatingFilterProxy,但随后它抛出:

java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered?

我猜我需要告诉 Jetty 使用 WebApplicationContext,但是如何?

【问题讨论】:

  • 为什么不创建一个带有 main 方法的类来运行您的应用程序? Spring Boot 将为您完成设置。请参阅spring.io/guides/gs/securing-web 和 next 将 jar 转换为战争 spring.io/guides/gs/convert-jar-to-war
  • 我正在这样做——正如 Spring Boot 文档所建议的那样。我只需要从 main() 初始化 Spring Security。
  • SPring boot 将执行此操作以及引导 Jetty 容器。我不明白你为什么要自己创建一个容器,因为 spring boot 为你做了所有这些......
  • 我使用 ServletContainer 来启动 Jersey ResourceConfig 类。
  • 仍然不明白为什么你需要自己做,创建一个JettyServerCustomizer 在你的上下文中注册它作为一个bean,spring boot 会为你应用它。端口等都将由 Spring Boot 设置。您还可以将配置注册为 ServletBean,以便 Spring Boot 注册它。

标签: java spring-security embedded-jetty spring-boot


【解决方案1】:

您的设置禁用了 Spring Boot 来发挥它的魔力。与其自己设置容器,不如让 Spring Boot 来处理它。您可以简单地将您的JettyServerCustomizer 作为@Bean 添加到配置中。这将执行它,您可以注册所需的任何内容。

这仍然允许 Spring Boot 发挥它的魔力,并且您已经注册了您需要的附加端点。

另一种解决方案是将 servlet 作为 ServletRegistrationBean 添加到您的配置中,然后 Spring Boot 会自动添加它。

【讨论】:

  • 谢谢!我知道我错过了像这样简单的东西。
猜你喜欢
  • 2023-04-08
  • 2017-09-20
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 2011-08-20
  • 2016-02-22
  • 1970-01-01
相关资源
最近更新 更多