http://localhost:8080/swagger-ui.html
放开keycloak权限
import com.umh.doctorreferral.api.security.CustomKeycloakAuthenticationProvider
import com.umh.doctorreferral.core.security.AppAuthority
import org.keycloak.adapters.KeycloakConfigResolver
import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver
import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider
import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter
import org.keycloak.adapters.springsecurity.filter.KeycloakAuthenticationProcessingFilter
import org.keycloak.adapters.springsecurity.filter.KeycloakPreAuthActionsFilter
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.web.servlet.FilterRegistrationBean
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.http.HttpMethod
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity
import org.springframework.security.config.annotation.web.builders.HttpSecurity
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity
import org.springframework.security.config.http.SessionCreationPolicy
import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper
import org.springframework.security.core.authority.mapping.SimpleAuthorityMapper
import org.springframework.security.web.authentication.session.NullAuthenticatedSessionStrategy
import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy
import org.springframework.web.cors.UrlBasedCorsConfigurationSource
import org.springframework.web.filter.CorsFilter
import java.util.*
import kotlin.jvm.Throws
@Throws(Exception::class) override fun configure(http: HttpSecurity) { super.configure(http) http .csrf().disable() .exceptionHandling() .and() .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeRequests() .antMatchers(HttpMethod.OPTIONS, "/**").permitAll() .antMatchers( "/actuator/**", "/health", "/auth", "/test", "/dummy", "/referral" ).permitAll()// .antMatchers( "/v2/api-docs", "/configuration/ui", "/swagger-resources/**", "/configuration/security", "/swagger-ui.html", "/webjars/**" ).permitAll()// .antMatchers( HttpMethod.POST, "/password-reset", "/users/self/password-reset", "/password-reset-verification" ).permitAll()// //放开权限 .antMatchers("/v3/api-docs/**", "/swagger-ui/**", "/swagger-ui.html").permitAll() .anyRequest() .hasAnyAuthority(*AppAuthority::class.java.declaredFields.map { it.name }.toTypedArray()) http.addFilterBefore(corsFilter(), CorsFilter::class.java) }
swaggerV3
添加swagger3.0依赖(build gradle)
// spring-boot-test testApi('org.springframework.boot:spring-boot-starter-test') // openapi api 'org.springdoc:springdoc-openapi-ui:1.5.8' // openapi-security api 'org.springdoc:springdoc-openapi-security:1.5.8' compile('org.springdoc:springdoc-openapi-ui:1.5.8') compile('org.springdoc:springdoc-openapi-security:1.5.8')
启动类配置
package com.umh.doctorreferral.api import com.fasterxml.jackson.databind.MapperFeature import com.umh.doctorreferral.core.audit.SpringSecurityAuditorAware import com.umh.doctorreferral.core.config.CoreConfiguration import com.umh.doctorreferral.core.jsonview.JsonViews import com.umh.doctorreferral.core.properties.ApplicationProperties import com.umh.doctorreferral.core.utils.ApplicationJsonObjectMapper import io.swagger.annotations.Api import io.swagger.v3.oas.models.Components import io.swagger.v3.oas.models.OpenAPI import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder import org.keycloak.OAuth2Constants import org.keycloak.adapters.springboot.KeycloakSpringBootProperties import org.keycloak.admin.client.Keycloak import org.keycloak.admin.client.KeycloakBuilder import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication import org.springframework.boot.web.servlet.ServletComponentScan import org.springframework.cache.annotation.EnableCaching import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Import import org.springframework.data.domain.AuditorAware import org.springframework.data.domain.Pageable import org.springframework.data.domain.Sort import org.springframework.data.jpa.repository.config.EnableJpaAuditing import org.springframework.http.MediaType import org.springframework.http.converter.HttpMessageConverter import org.springframework.http.converter.ResourceHttpMessageConverter //增加 import org.springframework.http.converter.StringHttpMessageConverter import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter import org.springframework.scheduling.annotation.EnableScheduling import org.springframework.web.servlet.config.annotation.WebMvcConfigurer 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.spi.DocumentationType import springfox.documentation.spring.web.plugins.Docket import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc import java.security.Security import java.util.* @EnableJpaAuditing @EnableCaching @EnableScheduling @EnableSwagger2WebMvc @SpringBootApplication @Import(com.umh.doctorreferral.core.config.CoreConfiguration::class) @ServletComponentScan("com.umh.doctorreferral") open class ApiApplication : WebMvcConfigurer { @Autowired private lateinit var appProperties: ApplicationProperties @Bean fun api(): Docket? { return Docket(DocumentationType.SWAGGER_2) .directModelSubstitute(Locale::class.java, String::class.java) .directModelSubstitute(Sort::class.java, String::class.java) .directModelSubstitute(Sort::class.java, String::class.java) .directModelSubstitute(Pageable::class.java, Void::class.java) .globalOperationParameters( listOf( ParameterBuilder() .name("X-Auth-Token") .modelRef(ModelRef("string")) .parameterType("header") .required(true) .build() ) ).apiInfo( ApiInfo( "CASE CONNECT API", null, "1.0", null, null, null, null, Collections.emptyList()) ) .select() .apis(RequestHandlerSelectors.withClassAnnotation(Api::class.java)) .paths(PathSelectors.any()) .build() .enable(appProperties.environment?.toUpperCase() != "PROD") } @Bean internal fun auditorProvider(): AuditorAware<UUID> { return com.umh.doctorreferral.core.audit.SpringSecurityAuditorAware() } //增加 @Bean fun customOpenAPI(): OpenAPI? { return OpenAPI() .components(Components()) .info( Info().title("Referral System API").version("1.5.8") .license(License().name("Apache 2.0").url("http://springdoc.org")) ) } override fun configureMessageConverters(converters: MutableList<HttpMessageConverter<*>>) { // ActuatorMediaTypes() val supportedMediaTypes = ArrayList<MediaType>() supportedMediaTypes.add(MediaType.APPLICATION_JSON) supportedMediaTypes.add(MediaType.valueOf("application/vnd.spring-boot.actuator.v3+json")) supportedMediaTypes.add(MediaType.TEXT_PLAIN) val converter = MappingJackson2HttpMessageConverter() val objectMapper = ApplicationJsonObjectMapper() objectMapper.setConfig(objectMapper.serializationConfig.withView(JsonViews.Admin::class.java)) objectMapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, true) converter.objectMapper = objectMapper converter.setPrettyPrint(true) converter.supportedMediaTypes = supportedMediaTypes //增加 converters.add(0, StringHttpMessageConverter()) converters.add(1, converter) converters.add(ResourceHttpMessageConverter()) } } fun main(args: Array<String>) { Security.setProperty("crypto.policy", "unlimited") runApplication<ApiApplication>(*args) }
controller
import io.swagger.v3.oas.annotations.Operation
import io.swagger.v3.oas.annotations.tags.Tag
@RestController
@Tag(name = "医生转介单", description = "医生转介单")
class DoctorReferralCaseController {
@Autowired
private lateinit var apiDoctorReferralCaseService : ApiDoctorReferralCaseService
@Operation(summary = "医生列表搜索", description = "医生列表搜索")
@GetMapping("/doctors")
fun doctorSearch(doctorsRequest : DoctorsRequest) : Json? {
return apiDoctorReferralCaseService.getDoctors(doctorsRequest)
}