#spring-security #spring-4
Вопрос:
Я пытался включить базовую аутентификацию для своих конечных точек весной 4. Но, похоже, это ничего не дает.
Есть идеи?
Если я поставлю точку останова, я смогу увидеть, что метод configure вызывается только при запуске сервера.
package org.example; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @Validated public class MyController { @RequestMapping(value = "/health") public String health() { return "OK"; } @RequestMapping(value = "/getdata") public String getData() { return "data"; } }
package org.example; import org.springframework.http.HttpMethod; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @EnableWebSecurity public class BasicAuthConfig extends WebSecurityConfigurerAdapter { // Authentication : User --gt; Roles @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("appuser") .password("{noop}apipassword") .roles("USER"); } @Override protected void configure(HttpSecurity http) throws Exception { http //HTTP Basic authentication .httpBasic() .and() .authorizeRequests() .antMatchers(HttpMethod.GET, "/rest/**").hasRole("USER") .antMatchers(HttpMethod.POST, "/cxf/**").hasRole("USER") .and() .csrf().disable() .formLogin().disable(); } }
Мой web.xml
lt;!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" gt; lt;web-appgt; lt;display-namegt;Archetype Created Web Applicationlt;/display-namegt; lt;context-paramgt; lt;param-namegt;contextConfigLocationlt;/param-namegt; lt;param-valuegt;/WEB-INF/applicationContext.xmllt;/param-valuegt; lt;/context-paramgt; lt;listenergt; lt;listener-classgt;org.springframework.web.context.ContextLoaderListenerlt;/listener-classgt; lt;/listenergt; lt;servletgt; lt;servlet-namegt;cxflt;/servlet-namegt; lt;display-namegt;CXF Servletlt;/display-namegt; lt;servlet-classgt;org.apache.cxf.transport.servlet.CXFServletlt;/servlet-classgt; lt;load-on-startupgt;101lt;/load-on-startupgt; lt;init-paramgt; lt;param-namegt;use-x-forwarded-headerslt;/param-namegt; lt;param-valuegt;truelt;/param-valuegt; lt;/init-paramgt; lt;/servletgt; lt;servletgt; lt;servlet-namegt;restlt;/servlet-namegt; lt;servlet-classgt;org.springframework.web.servlet.DispatcherServletlt;/servlet-classgt; lt;load-on-startupgt;103lt;/load-on-startupgt; lt;/servletgt; lt;servlet-mappinggt; lt;servlet-namegt;restlt;/servlet-namegt; lt;url-patterngt;/rest/*lt;/url-patterngt; lt;/servlet-mappinggt; lt;servlet-mappinggt; lt;servlet-namegt;cxflt;/servlet-namegt; lt;url-patterngt;/cxf/*lt;/url-patterngt; lt;/servlet-mappinggt; lt;/web-appgt;
http://localhost:8080/TestWeb3/rest/health по — прежнему доступен без аутентификации
Ответ №1:
Оказывается, мне нужно подключить фильтр безопасности в web.xml следующим образом
lt;!-- Spring Security --gt; lt;filtergt; lt;filter-namegt;springSecurityFilterChainlt;/filter-namegt; lt;filter-classgt;org.springframework.web.filter.DelegatingFilterProxylt;/filter-classgt; lt;/filtergt; lt;filter-mappinggt; lt;filter-namegt;springSecurityFilterChainlt;/filter-namegt; lt;url-patterngt;/*lt;/url-patterngt; lt;/filter-mappinggt;