Адрес фактического центра электронной коммерции SpringBoot (40k+star):GitHub.com/macro-positive/…
Резюме
Интеграция Swagger в предыдущие проекты осуществлялась напрямую через зависимостиspringfox-swagger
,springfox-swagger-ui
Он реализован двумя jar-пакетами.Недавно я обнаружил, что версия springfox 3.0.0 уже имеет собственный SpringBoot Starter, который больше соответствует проекту SpringBoot.Это очень удобно и рекомендуется всем!
Используйте официальный Стартер
Давайте сначала воспользуемся официальным Starter для интеграции Swagger, чтобы убедиться, что это достаточно просто!
- первый в
pom.xml
Добавьте официальную зависимость Swagger от springfox;
<!--springfox swagger官方Starter-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
- Добавьте Java-конфигурацию Swagger, настройте информацию API и путь сканирования класса, необходимый для создания документа интерфейса;
/**
* Swagger2API文档的配置
*/
@Configuration
public class Swagger2Config {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.macro.mall.tiny.controller"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("SwaggerUI演示")
.description("mall-tiny")
.contact(new Contact("macro", null, null))
.version("1.0")
.build();
}
}
- Чтобы получить доступ к информации о документации по API, перейдите по адресу:http://localhost:8088/swagger-ui/
- Два шага, чтобы получить Swagger, интегрированный в SpringBoot, это очень просто!
по сравнению с предыдущей версией
Прежде чем мы использовали версию Springfox 2.9.2, сравните использование SpringBoot Starter 3.0.0, чтобы увидеть, в чем разница!
- Старые версии требуют зависимостей
springfox-swagger2
иspringfox-swagger-ui
Две конфигурации, новую версию можно сделать одним Стартером, и если предыдущая версия не использует новую версиюswagger-models
иswagger-annotations
Зависимость, появится интерфейс доступаNumberFormatException
проблема;
<dependencies>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</exclusion>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
</dependency>
<!--解决Swagger 2.9.2版本NumberFormatException-->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.6.0</version>
</dependency>
</dependencies>
-
В новой версии удалены некоторые сторонние зависимости, в том числе
guava
, при использовании старой версии ранее из-заguava
Проблемы с версиями привели к конфликтам зависимостей, подробности см. ниже.«Я обновил Swagger до новой версии, но не ожидал, что будет столько ям! 》; -
Путь доступа к новой версии и старой версии документа изменился.Новая версия:http://localhost:8088/swagger-ui/, старая версия была:http://localhost:8088/swagger-ui.html
-
В новой версии добавлены некоторые конфигурации SpringBoot,
springfox.documentation.enabled
Конфигурация может контролировать, следует ли включать функцию создания документов Swagger;
- Например, мы хотим только
dev
среду, чтобы включить документацию Swagger, в то время как вprod
Я не хочу включать его в среде, мы можем пройти старую версию@Profile
Реализация аннотаций;
@Configuration
@EnableSwagger2
@Profile(value = {"dev"})
public class Swagger2Config {
}
- Для новой версии мы можем настроить его в файле конфигурации SpringBoot.
springfox.documentation.enabled
существуетapplication-dev.yml
Настроен на true, вapplication-prod.yml
настроен на ложь.
Интеграция использования Spring Security
Мы часто используем Spring Security для реализации аутентификации при входе в наши проекты.Далее давайте поговорим о том, как использовать Swagger для интеграции Spring Security для доступа к интерфейсам, требующим аутентификации при входе.
- Как получить доступ к интерфейсу, который требует аутентификации при входе? Просто добавьте легальный при доступе к интерфейсу
Authorization
Заголовка запроса достаточно, и ниже приведена конфигурация, связанная с Swagger;
/**
* Swagger2API文档的配置
*/
@Configuration
public class Swagger2Config {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.macro.mall.tiny.controller"))
.paths(PathSelectors.any())
.build()
//添加登录认证
.securitySchemes(securitySchemes())
.securityContexts(securityContexts());
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("SwaggerUI演示")
.description("mall-tiny")
.contact(new Contact("macro", null, null))
.version("1.0")
.build();
}
private List<SecurityScheme> securitySchemes() {
//设置请求头信息
List<SecurityScheme> result = new ArrayList<>();
ApiKey apiKey = new ApiKey("Authorization", "Authorization", "header");
result.add(apiKey);
return result;
}
private List<SecurityContext> securityContexts() {
//设置需要登录认证的路径
List<SecurityContext> result = new ArrayList<>();
result.add(getContextByPath("/brand/.*"));
return result;
}
private SecurityContext getContextByPath(String pathRegex) {
return SecurityContext.builder()
.securityReferences(defaultAuth())
.forPaths(PathSelectors.regex(pathRegex))
.build();
}
private List<SecurityReference> defaultAuth() {
List<SecurityReference> result = new ArrayList<>();
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
authorizationScopes[0] = authorizationScope;
result.add(new SecurityReference("Authorization", authorizationScopes));
return result;
}
}
- Нам нужно настроить несанкционированный доступ к статическим ресурсам Swagger в Spring Security, например, к пути доступа к домашней странице.
/swagger-ui/
;
/**
* SpringSecurity的配置
* Created by macro on 2018/4/26.
*/
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UmsAdminService adminService;
@Autowired
private RestfulAccessDeniedHandler restfulAccessDeniedHandler;
@Autowired
private RestAuthenticationEntryPoint restAuthenticationEntryPoint;
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity.csrf()// 由于使用的是JWT,我们这里不需要csrf
.disable()
.sessionManagement()// 基于token,所以不需要session
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers(HttpMethod.GET, // 允许对于网站静态资源的无授权访问
"/",
"/swagger-ui/",
"/*.html",
"/favicon.ico",
"/**/*.html",
"/**/*.css",
"/**/*.js",
"/swagger-resources/**",
"/v2/api-docs/**"
)
.permitAll()
.antMatchers("/admin/login")// 对登录注册要允许匿名访问
.permitAll()
.antMatchers(HttpMethod.OPTIONS)//跨域请求会先进行一次options请求
.permitAll()
.anyRequest()// 除上面外的所有请求全部需要鉴权认证
.authenticated();
// 省略若干配置......
}
}
- Вызовите интерфейс входа в систему, чтобы получить токен, пароль учетной записи
admin:123456
;
- нажмите
Authorize
Войти после кнопкиAuthorization
заголовок запроса, а затем вы можете получить доступ к интерфейсу, который требует аутентификации входа.
Суммировать
Официальный Swagger Starter решает ряд проблем при интеграции Swagger ранее, упрощает процесс интеграции Swagger с SpringBoot и более удобен в использовании. В то же время в использовании некоторых сложных конфигураций практически нет изменений, и некоторые предыдущие методы использования все еще могут быть использованы!
Адрес исходного кода проекта
Эта статьяGitHubGitHub.com/macro-positive/…Записано, приветствую всех на Star!