在Linux系统中,Swagger的权限控制可以通过多种方式实现,以下是一些常见的方法:
Spring Security是一个强大的安全框架,可以用于认证和授权。以下是一个基本的步骤:
pom.xml
文件中添加Spring Security和Swagger的依赖。<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <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>
@Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/swagger-ui.html", "/webjars/**", "/swagger-resources/**", "/v2/api-docs").authenticated() .anyRequest().permitAll() .and() .httpBasic(); } @Bean public UserDetailsService userDetailsService() { UserDetails user = User.withDefaultPasswordEncoder() .username("user") .password("password") .roles("USER") .build(); return new InMemoryUserDetailsManager(user); } }
@Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.basePackage("com.example.demo")) .paths(PathSelectors.any()) .build() .securitySchemes(Arrays.asList(securityScheme())) .securityContexts(Arrays.asList(securityContext())); } private SecurityScheme securityScheme() { return new BasicAuth("user", "password"); } private SecurityContext securityContext() { return SecurityContext.builder() .securityReferences(defaultAuth()) .forPaths(PathSelectors.any()) .build(); } List<SecurityReference> defaultAuth() { AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; authorizationScopes[0] = authorizationScope; return Arrays.asList(new SecurityReference("Basic Auth", authorizationScopes)); } }
OAuth2是一种开放标准,用于授权访问受保护的资源。以下是一个基本的步骤:
npm install -g swagger-jsdoc swagger-ui-express
swagger.json
的文件,用于定义Swagger规范和配置。{ "openapi": "3.0.0", "info": { "title": "My API", "version": "1.0.0" }, "components": { "securitySchemes": { "Bearer": { "type": "http", "scheme": "bearer", "bearerFormat": "JWT" } } }, "security": [ { "Bearer": [] } ] }
swagger-jsdoc
库来加载Swagger配置,并使用swagger-ui-express
库来启动Swagger UI。const express = require('express'); const swaggerUi = require('swagger-ui-express'); const swaggerJsDoc = require('swagger-jsdoc'); const app = express(); const swaggerOptions = { swaggerDefinition: { openapi: '3.0.0', info: { title: 'My API', version: '1.0.0' } }, apis: ['./routes/*.js'] }; const swaggerDocs = swaggerJsDoc(swaggerOptions); app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocs)); app.listen(3000, () => { console.log('Server is running on port 3000'); });
const passport = require('passport'); const OAuth2Strategy = require('passport-oauth2').Strategy; passport.use(new OAuth2Strategy({ authorizationURL: 'https://your-auth-server.com/auth', tokenURL: 'https://your-auth-server.com/token', clientID: 'your-client-id', clientSecret: 'your-client-secret', callbackURL: 'http://localhost:3000/auth/callback' }, function(accessToken, refreshToken, profile, cb) { // 在这里,你可以查找或创建用户,并将用户信息与访问令牌关联 // 然后调用cb(null, user)来完成授权过程 } )); module.exports = passport;
passport.authenticate()
中间件来保护API路由。const express = require('express'); const passport = require('./auth'); const router = express.Router(); router.get('/protected', passport.authenticate('oauth2', { session: false }), (req, res) => { res.json({ message: 'This is a protected route' }); }); module.exports = router;
Swagger UI支持Basic Authentication,可以在swagger-ui
配置文件中添加认证信息。
swagger-ui
配置:在swagger-ui
的index.html
文件中,添加Authorize认证。const ui = SwaggerUIBundle({ url: "https://your-api.com/swagger.json", dom_id: '#swagger-ui', presets: [ SwaggerUIBundle.presets.apis, SwaggerUIStandalonePreset ], plugins: [ SwaggerUIBundle.plugins.DownloadUrl ], requestInterceptor: function (req) { req.headers.Authorization = "Basic " + btoa("your-username:your-password"); return req; } });
server { listen 80; server_name your-swagger.domain.com; location / { auth_basic "Restricted Access"; auth_basic_user_file /etc/nginx/.htpasswd; root /var/www/swagger-ui; index index.html; } }
访问控制列表是一种将权限分配给用户或用户组的方法。你可以在后端服务中实现ACL,并根据用户的权限来决定是否允许他们访问特定的API端点。然后,你可以在Swagger文档中使用注释来表示这些关系。
如果你只想在开发环境使用Swagger,而不希望在生产环境暴露Swagger,建议禁用Swagger UI。
# 在Spring Boot的application.properties文件中 spring.profiles.active=prod swagger.enabled=false