Ubuntu环境下Swagger权限控制的实现方法
在Ubuntu系统中,Swagger(通常与Spring Boot集成)的权限控制需通过身份验证、授权机制、环境配置及传输安全等多维度实现,以下是具体步骤:
首先,在Spring Boot项目的pom.xml中添加Spring Security和Swagger的核心依赖,为权限控制提供基础框架:
<!-- Spring Security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- Swagger 2 -->
<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>
创建WebSecurityConfig类(继承WebSecurityConfigurerAdapter),通过HttpSecurity对象定义访问规则,限制Swagger UI及API文档的访问权限:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
// 需要认证的Swagger相关路径(UI、文档、资源)
.antMatchers("/swagger-ui.html", "/webjars/**", "/swagger-resources/**", "/v2/api-docs").authenticated()
// 其他请求允许匿名访问(根据需求调整)
.anyRequest().permitAll()
.and()
.httpBasic(); // 使用HTTP Basic认证(可替换为Form Login、JWT等)
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// 内存中存储用户信息(生产环境建议使用数据库)
auth.inMemoryAuthentication()
.withUser("admin").password("{noop}admin123").roles("ADMIN") // {noop}表示不加密密码(仅测试用)
.and()
.withUser("user").password("{noop}user123").roles("USER");
}
}
上述配置要求用户访问Swagger UI时必须输入账号密码(如admin/admin123或user/user123)。
创建SwaggerConfig类(继承WebMvcConfigurer),定义API文档的扫描范围及生成规则:
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
// 扫描指定包下的Controller类(根据项目结构调整)
.apis(RequestHandlerSelectors.basePackage("com.example.demo.controller"))
.paths(PathSelectors.any())
.build();
}
}
此配置会生成包含所有Controller接口的Swagger文档。
若需根据用户角色限制对特定API的访问,可细化Spring Security配置:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
// Swagger UI及文档需USER及以上角色访问
.antMatchers("/swagger-ui/**", "/v2/api-docs/**").hasRole("USER")
// 管理员专属接口(如/user/admin)
.antMatchers("/api/admin/**").hasRole("ADMIN")
// 其他接口允许匿名访问
.anyRequest().permitAll()
.and()
.httpBasic();
}
此时,仅拥有ADMIN角色的用户能访问/api/admin/**接口,而USER角色用户无法访问。
对于生产环境,建议使用OAuth2或JWT替代HTTP Basic认证(避免密码明文传输)。以JWT为例,需添加以下依赖:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
配置SecurityConfig类,启用JWT认证:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/swagger-ui/**", "/v2/api-docs/**").authenticated()
.anyRequest().permitAll()
.and()
.oauth2ResourceServer()
.jwt(); // 使用JWT解码器
}
@Bean
public JwtDecoder jwtDecoder() {
// 从认证服务器获取JWK Set URI(需替换为实际地址)
return NimbusJwtDecoder.withJwkSetUri("https://your-auth-server/.well-known/jwks.json").build();
}
}
同时,在Swagger UI中配置OAuth2安全方案(参考Swagger OpenAPI规范中的securitySchemes定义)。
application.properties中添加:springfox.documentation.enabled=false
或通过@Profile注解仅在开发环境加载Swagger配置。certbot工具为Ubuntu服务器配置HTTPS,加密Swagger UI与后端API之间的传输数据,防止中间人攻击。ufw)限制Swagger UI的访问IP,仅允许内部网络或特定IP访问:sudo ufw allow from 192.168.1.0/24 to any port 8080 # 允许192.168.1.0/24网段访问8080端口
sudo ufw enable # 启用防火墙
sudo apt update && sudo apt upgrade,修复系统和软件漏洞。/etc/ssh/sshd_config中的PermitRootLogin no),使用普通用户+sudo操作;设置强密码策略(如sudo passwd -l root锁定root账户)。auditd或logwatch监控系统日志,及时发现异常访问行为(如频繁的Swagger UI登录失败)。通过以上步骤,可在Ubuntu环境下为Swagger实现完善的权限控制,确保API文档及接口的安全性。