我试图在“localhost:8080/v2/api-docs”和“localhost:8080/swagger-ui.html”上看到swagger文档,但仍然失败。该项目已成功构建并在“localhost:8080/v2/apis/***”上运行。
在本地运行应用程序后,活动配置文件是本地的。
@Profile({"local", "local_kuh", "develop"})
@Configuration
@EnableSwagger2
public class SwaggerConfig {
private ApiInfo apiInfo() {
String description = "[DESCRIPTION]";
return new ApiInfoBuilder()
.title("Rest API Server")
.description(description)
.build();
}
private ApiKey apiKey() {
return new ApiKey("apiKey", "Authorization", "header");
}
@Bean
public SecurityConfiguration security() {
return SecurityConfigurationBuilder.builder().scopeSeparator(",")
.additionalQueryStringParams(null)
.useBasicAuthenticationWithAccessCodeGrant(false).build();
}
private SecurityContext securityContext() {
return SecurityContext.builder().securityReferences(defaultAuth())
.forPaths(PathSelectors.any()).build();
}
private List<SecurityReference> defaultAuth() {
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
authorizationScopes[0] = authorizationScope;
return Collections.singletonList(new SecurityReference("apiKey", authorizationScopes));
}
@Bean
public Docket commonApi() {
ParameterBuilder aParameterBuilder = new ParameterBuilder();
aParameterBuilder.name("Authorization")
.description("Access Tocken")
.modelRef(new ModelRef("string"))
.parameterType("header")
.required(false)
.build();
return new Docket(DocumentationType.SWAGGER_2)
.groupName("v2")
.apiInfo(this.apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("net.infobank.moyamo.controllers"))
.build()
.securitySchemes(Collections.singletonList(apiKey()))
.securityContexts(Collections.singletonList(securityContext()))
.useDefaultResponseMessages(false);
}
}
...
<!-- springfox-swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<!-- springfox-swager-ui -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
...
dependencies {
...
implementation 'io.springfox:springfox-swagger-ui:2.9.2'
implementation 'io.springfox:springfox-swagger2:2.9.2'
...
}
@Configuration
@AllArgsConstructor
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
private final BCryptPasswordEncoder bCryptPasswordEncoder;
private final DataSource datasource;
private final RestAuthenticationEntryPoint restAuthenticationEntryPoint;
private final TokenAuthorizationFilter tokenAuthorizationFilter;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.addFilterBefore(tokenAuthorizationFilter, UsernamePasswordAuthenticationFilter.class)
.authorizeRequests()
.antMatchers("/v2/auth/**").permitAll()
.antMatchers("/v2/notices/**").permitAll()
.antMatchers("/v2/policies/**").permitAll()
.antMatchers(HttpMethod.OPTIONS, "/v1/gambles", "/v1/gambles/**", "/v2/rankings").permitAll()
.antMatchers(HttpMethod.GET, "/v2/rankings").permitAll()
.antMatchers("/postings").permitAll()
.antMatchers("/static/**").permitAll()
.antMatchers("/docs/**").permitAll()
.antMatchers("/actuator/**").permitAll()
.antMatchers("/api/**").permitAll()
.antMatchers("/v2/shops").permitAll()
.antMatchers("/v2/api-docs", "/v2/logs", "/swagger-resources/**", "/swagger-ui.html", "/webjars/**", "/swagger/**").permitAll() //swagger
.antMatchers("/**").authenticated()
.anyRequest().authenticated()
.and()
.exceptionHandling()
.authenticationEntryPoint(restAuthenticationEntryPoint);
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.jdbcAuthentication().dataSource(datasource).passwordEncoder(bCryptPasswordEncoder);
}
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
}
我以为一切都设置为swagger文档/用户界面。但是仍然得到404错误。
我也看不到swagger-ui. html。
我认为swagger应该在本地个人资料上无需身份验证即可工作。但是无论是否授权,都不起作用。
如何解决此问题?提前感谢大家。
实际上现在我正在使用openapi,但我记得springfox的配置bean
@Configuration
@EnableSwagger2
public class SwaggerConfiguration {
@Bean
public Docket apiDefault() {
return docketGeneric("default", "/api/.*");
}
private Docket docketGeneric(String groupName, String pathsRegex) {
return new Docket(DocumentationType.SWAGGER_2)
.useDefaultResponseMessages(false)
.protocols(Collections.singleton("http"))
.groupName(groupName)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.regex(pathsRegex))
.build()
.forCodeGeneration(true);
}
最后我通过添加一些代码改变了下面的SwaggerConfig.java。
package com.msquare.flabook.configuration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.ApiKey;
import springfox.documentation.service.AuthorizationScope;
import springfox.documentation.service.SecurityReference;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger.web.SecurityConfiguration;
import springfox.documentation.swagger.web.SecurityConfigurationBuilder;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.Collections;
import java.util.List;
@Profile({"local", "local_kuh", "develop"})
@Configuration
@EnableSwagger2
public class SwaggerConfig {
private ApiInfo apiInfo() {
String description = "";
return new ApiInfoBuilder()
.title("Rest API Server")
.description(description)
.build();
}
private ApiKey apiKey() {
return new ApiKey("apiKey", "Authorization", "header");
}
@Bean
public SecurityConfiguration security() {
return SecurityConfigurationBuilder.builder().scopeSeparator(",")
.additionalQueryStringParams(null)
.useBasicAuthenticationWithAccessCodeGrant(false).build();
}
private SecurityContext securityContext() {
return SecurityContext.builder().securityReferences(defaultAuth())
.forPaths(PathSelectors.any()).build();
}
private List<SecurityReference> defaultAuth() {
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
authorizationScopes[0] = authorizationScope;
return Collections.singletonList(new SecurityReference("apiKey", authorizationScopes));
}
@Bean
public Docket commonApi() {
ParameterBuilder aParameterBuilder = new ParameterBuilder();
aParameterBuilder.name("Authorization")
.description("Access Tocken")
.modelRef(new ModelRef("string"))
.parameterType("header")
.required(false)
.build();
return new Docket(DocumentationType.SWAGGER_2)
.groupName("v2")
.apiInfo(this.apiInfo())
//.tags(new Tag("API", "v2"))
//.globalOperationParameters(aParameters)
.select()
.apis(RequestHandlerSelectors.basePackage("com.msquare.flabook.controllers"))
//.paths(PathSelectors.ant("/v2/auth/**"))
.build()
.securitySchemes(Collections.singletonList(apiKey()))
.securityContexts(Collections.singletonList(securityContext()))
.useDefaultResponseMessages(false);
}
/// newly added code
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build();
}
}
我注释了swagger的一些代码. "/**" 路径在swagger路由之前被调用。
package com.msquare.flabook.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
@RestController
public class CorsController {
protected void withCors(ServletResponse res) {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, Authorization");
}
@RequestMapping(method = RequestMethod.OPTIONS, path = "")
public String doOptionsMain() {
return "";
}
// comment for swagger
// @RequestMapping(method = RequestMethod.OPTIONS, path = "/**")
// public String doOptions() {
// return "";
// }
}