我有一个带有身份验证服务的简单REST应用程序。我尝试向其中添加swagger和swagger-ui,但只能在中看到端点/v2/api- docs。在其中,swagger-ui.html我仅看到端点组,但是无法扩展任何列表。
/v2/api- docs
swagger-ui.html
在chrome调试中,我看到:
加载资源失败:服务器响应状态为401() 未捕获的TypeError:无法读取未定义的属性’indexOf’
加载资源失败:服务器响应状态为401()
未捕获的TypeError:无法读取未定义的属性’indexOf’
在带有服务器的终端上:
错误10020-[nio-5001-exec-3] ctrapJwtAuthenticationEntryPoint:响应未经授权的错误。消息- 访问此资源需要完全认证
似乎我的配置文件缺少某些内容,我尝试了一些在Web上找到的解决方案,但仍然无济于事。
这是我的代码:
绒球
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency>
控制者
@RestController @PreAuthorize("hasRole('USER')") @RequestMapping(path = "restaurant") @Api(value="restaurant", description="Example operations for restaurants") public class RestaurantController { // endpoints }
agger豆
@Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.basePackage("com.tablebooker.restaurantservice.restaurant")) .paths(PathSelectors.any()) .build(); } }
安全配置
@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity( securedEnabled = true, jsr250Enabled = true, prePostEnabled = true ) public class SecurityConfig extends WebSecurityConfigurerAdapter { //other methods @Override protected void configure(HttpSecurity http) throws Exception { http .cors() .and() .csrf() .disable() .exceptionHandling() .authenticationEntryPoint(unauthorizedHandler) .and() .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeRequests() .antMatchers("/", "/favicon.ico", "/**/*.png", "/**/*.gif", "/**/*.svg", "/**/*.jpg", "/**/*.html", "/**/*.css", "/**/*.js") .permitAll() .antMatchers("/api/auth/**") .permitAll() .antMatchers("/restaurant/**") .hasRole("USER") .anyRequest() .authenticated(); http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); } @Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers("/v2/api-docs", "/configuration/ui", "/swagger-resources", "/configuration/security", "/swagger-ui.html", "/webjars/**"); } }
有什么想法可以使我的配置生效吗?
首先,您应该注册swagger的资源。
@Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("swagger-ui.html") .addResourceLocations("classpath:/META-INF/resources/"); } }
然后,因为您正在使用Spring Security,也许您应该关闭特权。
@Override public void configure(WebSecurity web) throws Exception { web.ignoring().mvcMatchers(HttpMethod.OPTIONS, "/**"); // ignore swagger web.ignoring().mvcMatchers("/swagger-ui.html/**", "/configuration/**", "/swagger-resources/**", "/v2/api-docs"); }
也许最好使用版本低于2.8.0的swagger,否则您可能不得不面对许多错误。