2015-06-18 4 views
4

Я разрабатываю приложение Spring, которое запускает встроенный сервер Jetty. Затем он «развертывает» веб-приложение Spring MVC на этом сервере Jetty.Embedded Jetty не распознает Spring MVC Security

Все работает хорошо с несколькими контроллерами, но я не могу добавить Spring Security в веб-приложение. Я использую программные и аннотаций на основе конфигурации и сервер 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 и переопределяет метод настройки, как так:

@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 об этой конфигурации, или я пропускаю что-то еще?

ответ

4

Хорошо, поэтому я пропустил то, что мне нужно добавить Spring DelegatingFilterProxy Spring в ServletContextHandler Jetty. Обычным способом Spring является расширение AbstractSecurityWebApplicationInitializer, которое добавит Filter Proxy. Это, к сожалению, также не работало с Jetty.

можно добавить прокси-фильтр вручную Jetty, хотя, с призывом объясняется в этом comment:

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)); 

Я также должен был включить Session-Handling в Jetty, но это объясняется очень хорошо here.

+3

Это сообщение спасло мою жизнь, но я tryto улучшить, предлагая использовать AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME вместо «springSecurityFilterChain» закодированного строки – Whimusical

+0

Чтобы включить сеансы, 'новый ServletContextHandler (ServletContextHandler.SESSIONS)' работает для меня. – approxiblue

Смежные вопросы