通过向代码中添加以下类,我向现有springboot REST API中添加了一个简单的招摇过市UI:
@EnableSwagger2
@Configuration
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.paths(PathSelectors.regex("/v1.*"))
.build()
.pathMapping("/")
.apiInfo(metadata());
}
private ApiInfo metadata() {
return new ApiInfoBuilder()
.title("My awesome API")
.description("Some description")
.version("1.0")
.build();
}
}
我的问题是,API应该是公共的,但招摇过市的文档不应该是公共的。我想要一种请求对swagger文档进行身份验证的方法,有人知道实现这一点的简单方法吗?
我试着用谷歌搜索它,但我只能找到誓言的东西,但这是endpoint的身份验证,而不是招摇过市的文档。。。
我用这个锅炉板来配置和保护swagger
@Configuration
@EnableSwagger2
public class SwaggerConfig extends WebSecurityConfigurerAdapter {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2).select().apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any()).build();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/v2/api-docs",
"/configuration/ui",
"/swagger-resources/**",
"/configuration/security",
"/swagger-ui.html",
"/webjars/**")
.authenticated().and().httpBasic();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("user").password("password").roles("USER");
}
}
这里有一个替代解决方案。这是关于仅在开发/qa环境中限制对swagger的访问。生产环境将无法访问Swagger。我正在使用一个属性(prop.swagger.enabled)作为标记,以绕过仅在开发/qa环境中针对swagger ui的Spring Security验证。
@Configuration
@EnableSwagger2
public class SwaggerConfiguration extends WebSecurityConfigurerAdapter implements WebMvcConfigurer {
@Value("${prop.swagger.enabled:false}")
private boolean enableSwagger;
@Bean
public Docket SwaggerConfig() {
return new Docket(DocumentationType.SWAGGER_2)
.enable(enableSwagger)
.select()
.apis(RequestHandlerSelectors.basePackage("com.your.controller"))
.paths(PathSelectors.any())
.build();
}
@Override
public void configure(WebSecurity web) throws Exception {
if (enableSwagger)
web.ignoring().antMatchers("/v2/api-docs",
"/configuration/ui",
"/swagger-resources/**",
"/configuration/security",
"/swagger-ui.html",
"/webjars/**");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
if (enableSwagger) {
registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}
}
当Swagger与spring boot应用程序集成时,Swagger文档将在/v2/api文档endpoint处可用。
为了保护资源,利用Spring Security机制,限制访问文档的endpoint
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
安全配置:仅限制用户访问endpoint
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/v2/api-docs").authenticated()
.and()
.httpBasic();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user").password("password").roles("USER");
}
}
此外,大摇大摆的用户界面。也可以根据需要保护html。
问题内容: 我有一个可通过HTTP访问的简单Web API,一些相应的移动应用程序正在读取该数据。现在有人反编译了一个应用程序/嗅探了HTTP流量,将URL转到了我的Web API,并建立了自己的客户端,就像我的客户端一样。 如何确保仅我自己的客户对API的访问权限?即使想到有人在反编译我的应用程序。 服务器和客户端代码更改是一个选择! 问题答案: 服务器和客户端代码更改是一个选择! 首先,您无法
通过向资源服务器出示访问令牌,客户端访问受保护资源。资源服务器必须验证访问令牌,并确保它没有过期且其范围涵盖了请求的资源。资源服务器用于验证访问令牌的方法(以及任何错误响应)超出了本规范的范围,但一般包括资源服务器和授权服务器之间的互动或协调。 客户端使用访问令牌与资源服务器进行证认的方法依赖于授权服务器颁发的访问令牌的类型。通常,它涉及到使用具有所采用的访问令牌类型的规范定义的身份验证方案(如R
我想知道人们在使用Spring Cloud Config时是如何处理安全方面的。我计划将Spring Cloud Config Server和Client与Spring Boot一起使用。从实现的角度来看,这是非常直接的,但是您如何处理向每个开发人员披露密码/访问权限的风险。例如,您运行一个包含所有环境配置的中央配置服务器。在配置客户端应用程序的中,您必须配置/才能访问配置服务器。到目前为止还不错
问题内容: 如何通过反射访问对象的继承保护字段? 问题答案: 您可能会遇到两个问题-字段可能无法正常访问(私有),并且不在您正在查看的类中,而是位于层次结构中的某个位置。 这样的事情甚至可以解决这些问题:
问题内容: 我有两节课。 类具有受保护的方法,是的实例。 Class 与class在同一包中。 我正在尝试访问,但正在获取… 怎么了? 问题答案: 编译器应该捕获这样的错误。当您显然在运行时得到此消息时,发生了一些奇怪的事情。可能您已更改了源代码,但已完全重新编译。 另一个潜在但晦涩的问题是通过不同的类加载器加载类。即使包名称相同,从不同的类加载器加载的类也将位于不同的包中(以与由不同的类加载器加
问题内容: 我正在研究使用SQL LocalDB作为客户端数据库,它将替代.net 4中开发的内部应用程序中的当前SQL CE 3.5数据库。 我遇到了一个不确定的问题,那就是LocalDB实例的安全设置。 如果我在.net中设置了一个脚本来创建一个私有LocalDB实例,例如(localdb)\ T1,然后在该实例中创建了一个新数据库,并添加了一个SQL用户帐户+密码(非域帐户),如何停止本地使