2015-06-17 4 views
1

У меня есть приложение с пружинной загрузкой с метрикой весенней безопасности и dropwizard. Он использует Angularjs как интерфейс. Аутентификация выполняется с помощью отдельной страницы login.html с контроллером angularjs, проводящим учетные данные для «/ login» и после последовательной маршрутизации ответа на index.html (отдельное приложение angularjs). Все это работает очень хорошо, пока я не попытаюсь получить доступ к меткам dropwizard. В этом случае я получаю исключение от Spring-security, говорящее, что пользователь анонимный (все остальные URL-адреса работают нормально).показатели весенней загрузки, весенней безопасности и dropwizard

Мой конфиг весна-безопасности:

@Configuration 
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) 
@EnableWebSecurity 
public class FormLoginSecurityConfigurer extends WebSecurityConfigurerAdapter { 

    private class AuthSuccessHandler implements AuthenticationSuccessHandler { 
     @Override 
     public void onAuthenticationSuccess(HttpServletRequest request, 
       HttpServletResponse response, Authentication authentication) 
       throws IOException, ServletException { 
      response.setStatus(HttpServletResponse.SC_OK); 
     } 
    } 

    private class AuthFailureHandler implements AuthenticationFailureHandler { 
     @Override 
     public void onAuthenticationFailure(HttpServletRequest request, 
       HttpServletResponse response, AuthenticationException exception) 
       throws IOException, ServletException { 
      response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 
     } 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests() 
       .antMatchers("/login.html", "/scripts/login/**", "/libs/**", "/styles/**", "/images/**").permitAll() 
       .anyRequest().authenticated() 
       .and() 
       .formLogin().loginPage("/login.html").loginProcessingUrl("/login") 
        .usernameParameter("username").passwordParameter("password") 
        .successHandler(new AuthSuccessHandler()) 
        .failureHandler(new AuthFailureHandler()) 
       .and().logout().logoutUrl("/logout").logoutSuccessUrl("/login.html") 
       .and().addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class) 
       .csrf().csrfTokenRepository(CsrfHeaderFilter.csrfTokenRepository()); 
    } 

    @Override 
    public void configure(AuthenticationManagerBuilder auth) throws Exception { 
     auth.inMemoryAuthentication().withUser("user").password("password").roles("USER"); 
    } 
} 

Метрики сервлет зарегистрирован в ServletContextInitilizer:

/** 
* Configuration of web application with Servlet 3.0 APIs. 
*/ 
@Configuration 
public class WebConfigurer implements ServletContextInitializer { 

    @Override 
    public void onStartup(ServletContext servletContext) throws ServletException { 
     initMetrics(servletContext, 
       EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.ASYNC)); 
    } 

    /** 
    * Initializes Metrics. 
    */ 
    private void initMetrics(ServletContext servletContext, EnumSet<DispatcherType> disps) { 
     log.debug("Initializing Metrics registries"); 
     servletContext.setAttribute(InstrumentedFilter.REGISTRY_ATTRIBUTE, 
       metricRegistry); 
     servletContext.setAttribute(MetricsServlet.METRICS_REGISTRY, 
       metricRegistry); 

     log.debug("Registering Metrics Filter"); 
     FilterRegistration.Dynamic metricsFilter = servletContext.addFilter("webappMetricsFilter", 
       new InstrumentedFilter()); 

     metricsFilter.addMappingForUrlPatterns(disps, true, "/*"); 
     metricsFilter.setAsyncSupported(true); 

     log.debug("Registering Metrics Servlet"); 
     ServletRegistration.Dynamic metricsAdminServlet = 
       servletContext.addServlet("metricsServlet", new MetricsServlet()); 

     metricsAdminServlet.addMapping("/metrics/metrics/*"); 
     metricsAdminServlet.setAsyncSupported(true); 
     metricsAdminServlet.setLoadOnStartup(2); 
    } 
} 

Однако, когда я достигаю ничего под/метрики/метрики браузер запрашивает для базовой аутентификации. Ответ имеет следующий заголовок WWW-Authenticate:"Basic realm="Spring"". Другие ресурсы загружаются в порядке.

Я новичок в таких приложениях и немного расстроен :) Любая помощь приветствуется.

+0

Вам действительно нужен сервлет с метками Dropwizard? Если вы включите в приложение приложение spring-boot-actuator, вы получите конечную точку/метрику, которая будет предоставлять метрики dropwizard. – jst

+0

Я пробовал без регистрации сервлета Dropwizard, и это не решило проблему - но ваш комментарий заставил меня искать, и я нашел эту тему http://stackoverflow.com/questions/23174275/configure-actuator-enpoints-security После несколько попыток я обнаружил, что удаление '@Order (SecurityProperties.ACCESS_OVERRIDE_ORDER)' из моей конфигурации разрешило проблему. Теперь URL-адрес/метрики защищен, и аутентификация работает. Я получил @Order из одного из образцов весны-загрузки-безопасности. Я понятия не имею, что это делает в любом случае: | – GrzegorzD

+0

Спасибо @jst - ваш комментарий действительно помог. – GrzegorzD

ответ

0

Кажется, его все в документации, если один знает, что искать - (. Management.security *) link

исполнительного механизма, функции безопасности могут быть изменены с помощью внешних свойств. Чтобы переопределить правила доступа к приложениям, добавьте @Bean типа WebSecurityConfigurerAdapter и используйте @Order (SecurityProperties.ACCESS_OVERRIDE_ORDER), если вы не хотите переопределять правила доступа к приводу или @Order (ManagementServerProperties.ACCESS_OVERRIDE_ORDER), если вы хотите переопределить правила доступа к приводу.

Изменен заказ ManagementServerProperties.ACCESS_OVERRIDE_ORDER, и теперь он работает.

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