嵌入式 Jetty 环境中的 Spring Boot 和 Spring Security 集成

Posted

技术标签:

【中文标题】嵌入式 Jetty 环境中的 Spring Boot 和 Spring Security 集成【英文标题】:Spring Boot and Spring Security integration in embedded Jetty environment 【发布时间】: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 注册它。 【参考方案1】:

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

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

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

【讨论】:

谢谢!我知道我错过了像这样简单的东西。

以上是关于嵌入式 Jetty 环境中的 Spring Boot 和 Spring Security 集成的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot如何使用内嵌式的Tomcat和Jetty?

28 | 新特性:Tomcat和Jetty如何处理Spring Boot应用?

Spring Boot 1.5.9和嵌入式jetty服务器在运行时抛出空指针异常?

Spring 3.1 WebApplicationInitializer & Embedded Jetty 8 AnnotationConfiguration

Embedded Jetty 无法识别 Spring MVC 安全性

jetty中传java参数(spring-io中的配置项)