tutorial example español ejemplo spring-mvc swagger swagger-ui swagger-2.0 springfox

spring mvc - example - Cómo configurar Spring Security para permitir que se acceda a Swagger URL sin autenticación



spring security tutorial español pdf (6)

Mi proyecto tiene Spring Security. Problema principal: no se puede acceder a la URL de swagger en http://localhost:8080/api/v2/api-docs . Dice encabezado de autorización faltante o inválido.

Captura de pantalla de la ventana del navegador Mi pom.xml tiene las siguientes entradas

<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.4.0</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.4.0</version> </dependency>

SwaggerConfig:

@Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2).select() .apis(RequestHandlerSelectors.any()) .paths(PathSelectors.any()) .build() .apiInfo(apiInfo()); } private ApiInfo apiInfo() { ApiInfo apiInfo = new ApiInfo("My REST API", "Some custom description of API.", "API TOS", "Terms of service", "[email protected]", "License of API", "API license URL"); return apiInfo; }

AppConfig:

@Configuration @EnableWebMvc @ComponentScan(basePackages = { "com.musigma.esp2" }) @Import(SwaggerConfig.class) public class AppConfig extends WebMvcConfigurerAdapter { // ========= Overrides =========== @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LocaleChangeInterceptor()); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("swagger-ui.html") .addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**") .addResourceLocations("classpath:/META-INF/resources/webjars/"); }

Entradas web.xml:

<context-param> <param-name>contextConfigLocation</param-name> <param-value> com.musigma.esp2.configuration.AppConfig com.musigma.esp2.configuration.WebSecurityConfiguration com.musigma.esp2.configuration.PersistenceConfig com.musigma.esp2.configuration.ACLConfig com.musigma.esp2.configuration.SwaggerConfig </param-value> </context-param>

WebSecurityConfig:

@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) @ComponentScan(basePackages = { "com.musigma.esp2.service", "com.musigma.esp2.security" }) public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity httpSecurity) throws Exception { httpSecurity .csrf() .disable() .exceptionHandling() .authenticationEntryPoint(this.unauthorizedHandler) .and() .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeRequests() .antMatchers("/auth/login", "/auth/logout").permitAll() .antMatchers("/api/**").authenticated() .anyRequest().authenticated(); // custom JSON based authentication by POST of {"username":"<name>","password":"<password>"} which sets the token header upon authentication httpSecurity.addFilterBefore(loginFilter(), UsernamePasswordAuthenticationFilter.class); // custom Token based authentication based on the header previously given to the client httpSecurity.addFilterBefore(new StatelessTokenAuthenticationFilter(tokenAuthenticationService), UsernamePasswordAuthenticationFilter.class); } }


Actualicé con / configuration / ** y / swagger-resources / ** y funcionó para mí.

@Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers("/v2/api-docs", "/configuration/ui", "/swagger-resources/**", "/configuration/**", "/swagger-ui.html", "/webjars/**"); }


Agregar esto a su clase de WebSecurityConfiguration debería hacer el truco.

@Configuration public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { @Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers("/v2/api-docs", "/configuration/ui", "/swagger-resources", "/configuration/security", "/swagger-ui.html", "/webjars/**"); } }


Más o menos esta página tiene respuestas, pero no todas están en un solo lugar. Estaba lidiando con el mismo problema y lo pasé bastante bien. Ahora entiendo mejor y me gustaría compartirlo aquí:

I Habilitando Swagger ui con Spring websecurity:

Si ha habilitado Spring Websecurity de forma predeterminada, bloqueará todas las solicitudes a su aplicación y devolverá 401. Sin embargo, para que la interfaz de usuario swagger se cargue en el navegador, swagger-ui.html realiza varias llamadas para recopilar datos. La mejor manera de depurar es abrir swagger-ui.html en un navegador (como google chrome) y usar las opciones de desarrollador (tecla ''F12''). Puede ver varias llamadas realizadas cuando se carga la página y si el swagger-ui no se carga completamente, probablemente algunas de ellas estén fallando.

Es posible que deba indicarle a Spring WebSecurity que ignore la autenticación para varios patrones de ruta de swagger. Estoy usando swagger-ui 2.9.2 y en mi caso a continuación están los patrones que tuve que ignorar:

Sin embargo, si está utilizando una versión diferente, la suya podría cambiar. Es posible que tenga que averiguar el suyo con la opción de desarrollador en su navegador como dije antes.

@Configuration public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { @Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers("/v2/api-docs", "/configuration/ui", "/swagger-resources/**", "/configuration/**", "/swagger-ui.html" , "/webjars/**", "/csrf", "/"); } }

II Habilitar swagger ui con interceptor

En general, es posible que no desee interceptar las solicitudes realizadas por swagger-ui.html. Para excluir varios patrones de swagger a continuación está el código:

La mayoría de los patrones de casos para la seguridad web y el interceptor serán los mismos.

@Configuration @EnableWebMvc public class RetrieveCiamInterceptorConfiguration implements WebMvcConfigurer { @Autowired RetrieveInterceptor validationInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(validationInterceptor).addPathPatterns("/**") .excludePathPatterns("/v2/api-docs", "/configuration/ui", "/swagger-resources/**", "/configuration/**", "/swagger-ui.html" , "/webjars/**", "/csrf", "/"); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("swagger-ui.html") .addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**") .addResourceLocations("classpath:/META-INF/resources/webjars/"); } }

Dado que es posible que deba habilitar @EnableWebMvc para agregar interceptores, es posible que también deba agregar manejadores de recursos a swagger de forma similar a como lo hice en el fragmento de código anterior.


Teniendo en cuenta todas sus solicitudes de API ubicadas con un patrón de URL de /api/.. puede decirle a spring que asegure solo este patrón de URL utilizando la configuración a continuación. Lo que significa que le estás diciendo a Spring qué asegurar en lugar de qué ignorar.

@Override protected void configure(HttpSecurity http) throws Exception { http .csrf().disable() .authorizeRequests() .antMatchers("/api/**").authenticated() .anyRequest().permitAll() .and() .httpBasic().and() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); }


Tuve el mismo problema al usar Spring Boot 2.0.0.M7 + Spring Security + Springfox 2.8.0. Y resolví el problema usando la siguiente configuración de seguridad que permite el acceso público a los recursos de la interfaz de usuario Swagger.

@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) public class SecurityConfiguration extends WebSecurityConfigurerAdapter { private static final String[] AUTH_WHITELIST = { // -- swagger ui "/v2/api-docs", "/swagger-resources", "/swagger-resources/**", "/configuration/ui", "/configuration/security", "/swagger-ui.html", "/webjars/**" // other public endpoints of your API may be appended to this array }; @Override protected void configure(HttpSecurity http) throws Exception { http. // ... here goes your custom security configuration authorizeRequests(). antMatchers(AUTH_WHITELIST).permitAll(). // whitelist Swagger UI resources // ... here goes your custom security configuration antMatchers("/**").authenticated(); // require authentication for any endpoint that''s not whitelisted } }


si su versión de Springfox superior a 2.5, debe agregar WebSecurityConfiguration como se muestra a continuación:

@Override public void configure(HttpSecurity http) throws Exception { // TODO Auto-generated method stub http.authorizeRequests() .antMatchers("/v2/api-docs", "/swagger-resources/configuration/ui", "/swagger-resources", "/swagger-resources/configuration/security", "/swagger-ui.html", "/webjars/**").permitAll() .and() .authorizeRequests() .anyRequest() .authenticated() .and() .csrf().disable(); }