我正在开发一个启动嵌入式Jetty服务器的Spring应用程序.然后它将Spring MVC Web应用程序“部署”到此Jetty服务器.
一切都适用于多个控制器,但我无法将Spring Security添加到Web应用程序中.
我使用基于编程和注释的配置,Jetty服务器配置如下:
Server server = new Server(8080);
server.setStopAtShutdown(true);
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.setConfigLocation("com.mypackage.web");
context.setParent(mainContext);
ServletContextHandler contextHandler = new ServletContextHandler();
contextHandler.setErrorHandler(null);
contextHandler.setContextPath("/");
DispatcherServlet dispatcherServlet = new DispatcherServlet(context);
DefaultServlet staticServlet = new DefaultServlet();
contextHandler.addServlet(new ServletHolder(dispatcherServlet), "/");
contextHandler.addServlet(new ServletHolder("staticServlet", staticServlet), "/res");
contextHandler.addEventListener(new ContextLoaderListener(context));
contextHandler.setResourceBase("webapp");
server.setHandler(contextHandler);
我还创建了一个com.mypackage.web.SecurityConfig类,它扩展了WebSecurityConfigurerAdapter并覆盖了configure方法,如下所示:
@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin().and()
.httpBasic();
}
}
据我了解文档,这应该足以“锁定”我的应用程序.当我在调试模式下启动应用程序时,在configure方法中遇到一个断点,因此Spring似乎检测到了配置类.
但是,我仍然可以访问我的应用程序中的任何页面,而无需重定向到默认登录表单.
我是否需要告诉Jetty Servlet容器有关此配置或我错过了其他内容?
解决方法:
好的,我错过的是我需要将Spring的DelegatingFilterProxy添加到Jetty的ServletContextHandler中.通常的Spring方法是扩展AbstractSecurityWebApplicationInitializer,它将添加Filter Proxy.
不幸的是,这也不适用于Jetty.
可以使用此comment中解释的调用,手动将过滤器代理添加到Jetty:
import static org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME;
...
ServletContextHandler contextHandler = new ServletContextHandler();
...
contextHandler.addFilter(
new FilterHolder( new DelegatingFilterProxy( DEFAULT_FILTER_NAME ) ),
"/*",
EnumSet.allOf( DispatcherType.class ));
我还必须在Jetty中启用会话处理,但这在here中得到了很好的解释.