У меня есть приложение с пружинной загрузкой с метрикой весенней безопасности и 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""
. Другие ресурсы загружаются в порядке.
Я новичок в таких приложениях и немного расстроен :) Любая помощь приветствуется.
Вам действительно нужен сервлет с метками Dropwizard? Если вы включите в приложение приложение spring-boot-actuator, вы получите конечную точку/метрику, которая будет предоставлять метрики dropwizard. – jst
Я пробовал без регистрации сервлета Dropwizard, и это не решило проблему - но ваш комментарий заставил меня искать, и я нашел эту тему http://stackoverflow.com/questions/23174275/configure-actuator-enpoints-security После несколько попыток я обнаружил, что удаление '@Order (SecurityProperties.ACCESS_OVERRIDE_ORDER)' из моей конфигурации разрешило проблему. Теперь URL-адрес/метрики защищен, и аутентификация работает. Я получил @Order из одного из образцов весны-загрузки-безопасности. Я понятия не имею, что это делает в любом случае: | – GrzegorzD
Спасибо @jst - ваш комментарий действительно помог. – GrzegorzD