在Linux上實現Swagger的安全認證,通常涉及到對API文檔訪問權限的控制,確保只有經過認證的用戶才能查看或操作API文檔。這可以通過多種方式實現,例如使用基本認證、OAuth2、JWT等。以下是基于Spring Boot和Springdoc(用于生成OpenAPI文檔的工具)實現安全認證的一些步驟:
首先,需要在你的Spring Boot項目中引入springdoc-openapi-starter-webmvc-ui依賴,這是Springdoc提供的用于集成Swagger UI和OpenAPI文檔的工具。
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.1.0</version>
</dependency>
Springdoc支持多種認證機制,包括OAuth2和JWT。以下是一個基本的配置示例,展示如何在Spring Boot應用中啟用OAuth2認證:
import io.swagger.v3.oas.annotations.security.Security;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@Security(name = "oauth2", securitySchemes = {
@SecurityScheme(name = "oauth2", type = SecurityScheme.Type.OAUTH2, flows = {
@SecurityFlow(name = "authorizationCode", authorizationUrl = "/oauth/authorize", tokenUrl = "/oauth/token")
})
})
public class SecurityConfig {
@Bean
public SecurityRequirement securityRequirement() {
return new SecurityRequirement().securitySchemes(Collections.singletonList(securityScheme())).securityContexts(Collections.singletonList(securityContext()));
}
@Bean
public SecurityScheme securityScheme() {
return new OAuth("oauth2", Collections.singletonList(new AuthorizationScope("read", "read access")), Collections.singletonList(new GrantType("authorization_code", new AuthorizationCodeUrl("/oauth/authorize"), new TokenUrl("/oauth/token"))));
}
@Bean
public SecurityContext securityContext() {
return SecurityContext.builder()
.securityReferences(defaultAuth())
.forPaths(PathSelectors.any())
.build();
}
private List<AuthorizationScope> defaultAuth() {
return Collections.singletonList(new AuthorizationScope("read", "read access"));
}
}
在application.properties文件中,可以配置OAuth2相關的參數,例如客戶端ID和客戶端密鑰:
springdoc.security.oauth2.client-id=your-client-id
springdoc.security.oauth2.client-secret=your-client-secret
springdoc.security.oauth2.token-url=/oauth/token
配置完成后,訪問Swagger UI時,系統會提示用戶進行認證。用戶需要先通過OAuth2授權流程獲取訪問令牌,然后在Swagger UI中使用該令牌進行認證。
除了OAuth2,還可以使用JWT進行認證。JWT通常與Spring Security結合使用,可以在控制器方法上添加安全注解來保護API:
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
@Tag(name = "Protected API")
public class ProtectedController {
@GetMapping("/secure")
public String secureEndpoint() {
return "This is a secure endpoint";
}
}
在Spring Security配置中,需要添加對Swagger UI端點的保護:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.oauth.jwt.JwtDecoder;
import org.springframework.security.oauth.jwt.NimbusJwtDecoder;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests(authorizeRequests ->
authorizeRequests
.antMatchers("/swagger-ui/**", "/v2/api-docs/**").permitAll()
.anyRequest().authenticated()
)
.oauth2ResourceServer(oauth2 ->
oauth2
.jwt(jwt ->
jwt.decoder(jwtDecoder())
)
);
}
@Bean
public JwtDecoder jwtDecoder() {
return NimbusJwtDecoder.withJwkSetUri("https://your-auth-server/.well-known/jwks.json").build();
}
}
通過上述步驟,可以在Linux系統上使用Swagger實現安全認證,確保API文檔的訪問受到保護。