要求:
代码:已实现
@EnableWebSecurity
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/swagger-resources/*", "*.html", "/api/v1/swagger.json")
.hasAuthority("SWAGGER")
.anyRequest().permitAll()
.and()
.httpBasic()
.and()
.csrf().disable();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("admin").password("admin").authorities("SWAGGER");
}
}
然而,这段代码无法工作-您可以自由浏览/炫耀ui。html#/没有任何授权。
问题是-为什么BASIC身份验证和用户不适用于swagger uiendpoint?
您的配置很奇怪。你可以尝试这样的事情:
public static void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.antMatcher("/swagger-ui.html")
.authorizeRequests()
.anyRequest().hasAnyRole("SWAGGER")
.and()
.httpBasic();
}
这确保了对swagger ui的授权。html
path(具有SWAGGER
角色)。
你可以做如下事情
昂首阔步的代码如下。
private List<SecurityScheme> basicScheme() {
List<SecurityScheme> schemeList = new ArrayList<>();
schemeList.add(new BasicAuth("basicAuth"));
return schemeList;
}
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.
.
.
.securitySchemes(basicScheme());
}
用于安全配置
public void configureGlobal(final AuthenticationManagerBuilder auth)
throws Exception {
auth.inMemoryAuthentication()
.withUser("USER")
.password("PASSWORD")
.roles("ADMIN");
}
.
.
.
@Override
protected void configure(final HttpSecurity httpSecurity) throws Exception {
httpSecurity.csrf().disable().authorizeRequests()
.anyRequest().authenticated().and().sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and().httpBasic();
}
.
.
.
@Override
public void configure(final WebSecurity web) throws Exception {
web.ignoring().antMatchers("/v2/api-docs",
"/configuration/ui",
"/swagger-resources/**",
"/webjars/**",
"/configuration/security",
"/swagger-ui.html");
}
下面使用 swagger 将授权传递给方法。
@PutMapping("/registration/{id}")
@ApiOperation(value = "Update registration detail",
authorizations = { @Authorization(value="basicAuth") })
public ResponseEntity<RegistrationModel> updateRegistration(
在你的pom.xml,你将需要:
<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>
基本上就是这样。
您应该使用. Authated()
而不是. permitAll()
:
.authorizeRequests()
.antMatchers("/swagger-resources/*", "*.html", "/api/v1/swagger.json")
.hasRole("SWAGGER")
.anyRequest()
.authenticated()
这将:
> < li>
限制对匹配< code >/swagger-resources/* ,< code>*的所有资源的访问。html和< code >/API/v1/swagger . JSON
允许对所有其他资源进行未经身份验证的访问
为了澄清为什么您的配置不起作用,这是因为您没有像应该阅读的那样阅读Spring-Security。
您的旧配置如下所示:
.authorizeRequests() // allow requests
.antMatchers(...) // that matches this
.hasAuthority("SWAGGER") // with SWAGGER authority
.anyRequest() // All requests above
.permitAll() // grant full access
换句话说,您正在向具有 SWAGGER
权限的用户授予完全访问权限,但您忽略了的是,默认情况下,他们已经有权访问它。更准确地说,除非您另有说明,否则每个人都可以访问它。
通过使用 .身份验证 ()
。你告诉Spring,你希望所有匹配的请求都仅限于具有适当角色
或权限
的人。
新配置:
.authorizeRequests() // allow requests
.antMatchers(...) // that matches this
.hasRole("SWAGGER") // with role SWAGGER
.anyRequest() // all requests above
.authenticated() // needs authentication
关于您的/swagger resources
、/swaggers resources/configuration/securityreturning 401问题:
您应该将
/swagger resources/*
替换为/swaggerresources/**
。
在配置末尾添加以下内容,以允许所有不匹配的请求:
.authorizeRequests()
.anyRequest()
.permitAll();
我正在将Monolith Java/Spring服务器重写为MicroService,同时向客户机公开相同的API接口,这样他们就不会注意到任何更改。 在Monolith服务器中,我们使用和。 第一部分是创建一个基于Java的API-Gateway,它将处理所有身份验证/授权作为通往Monolith服务器的隧道。 创建新的微服务(使用spring Initializer)后,我尝试将spring
.Net Framework 4.6.1,类库项目(Web API) 我已经将swagger/swashbuckle nuget添加到项目中,并将SwaggerConfig.cs文件添加到我的App_Start文件夹中。 SwaggerConfig.cs的剪报 然后我继续注册服务 但是我不确定在哪里设置了查看文档所需的用户名/密码。API方法都使用令牌进行认证,但是我试图添加一个安全层,通过使用基
我已经集成了Swagger,以便使用SpringBoot为SpringREST应用程序生成API文档。它工作得很好,当我点击URL时,我可以看到生成的API文档:http://localhost:8080/test/swagger-用户界面。html我的问题是如何限制对API的访问?基于硬编码用户名和密码的基本身份验证应该足够好,至少从一开始就足够了。我使用maven添加了“swagger2”依赖
我正在尝试使用OAuth2实现开发一个带有Spring Security性的rest api。但是如何删除基本身份验证呢。我只想向body发送用户名和密码,并在postman上获取令牌。 要删除基本身份验证,并从邮递员的get token中发送body标记中的用户名密码吗 我遇到了一些问题{"错误":"未经授权","error_description":"没有客户端身份验证。尝试添加适当的身份验证
但我对spring-boot/java还是个新手...有谁能帮我把这条路走对吗? 多谢了。
我想使用基本身份验证调用keydrope Rest API。为了做到这一点,我尝试了下面的答案,但缺少链接。 我已将客户端访问类型设置为机密,并启用了直接访问授权。 显然,需要在Java适配器配置中指定启用基本身份验证,但我看不出这是如何实现的。文档中提到它是一个JSON文件,听起来像是我将其作为配置添加到Keyclope目录中。 最后,我看到有人提到使用生成的秘密。我可以在选项卡中生成一个秘密,