5

我将此依赖项添加到我的 Spring Boot 应用程序中

 <dependency>
      <groupId>org.springdoc</groupId>
      <artifactId>springdoc-openapi-ui</artifactId>
      <version>1.4.3</version>
      <type>pom.sha512</type>
     </dependency>

然后我能够打开: https://localhost:8443/v3/api-docs

浏览器确实会询问我的凭据,只要我输入正确的用户/密码,它就可以工作,但它会向我显示全球可用的所有方法。我只希望用户有权使用的方法显示在 api 文档中。

对于一个特定的方法是使用这个标签来授权我的调用: @PreAuthorize("hasRole('USER') OR hasRole('ADMIN')")

这是我的网络安全配置类:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter
{

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception
    {
        auth.inMemoryAuthentication()
                .passwordEncoder(new BCryptPasswordEncoder())
                .withUser("user").password(new BCryptPasswordEncoder().encode("blabl")).roles("USER")
                .and()
                .withUser("admin").password(new BCryptPasswordEncoder().encode("blabla")).roles("ADMIN");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception
    {
        http.authorizeRequests()
                .antMatchers("/").permitAll()
                .anyRequest().authenticated()
                .and()
                .httpBasic();
    }
}
4

2 回答 2

2

我怀疑这是否可能,因为 API 文档是在启动时生成的(我认为)。

您可以做的是添加文档,指定哪些 API 调用需要哪些安全凭证,我在https://github.com/springdoc/springdoc-openapi#adding-api-information-and-security中发现了这一点-文档

因此,如果用户能够看到 API 页面,那么它也可能会看到它无权访问的端点(例如 /admin),但您可以向其中添加文档,使端点只能由管理员访问。

于 2020-08-13T14:27:52.863 回答
1

根据您提供的描述,我会推荐以下内容。

  1. 在端点上添加角色特定的安全性:

例如:

@Override
protected void configure(HttpSecurity http) throws Exception {
http
      .authorizeRequests()
        .antMatchers("/rest/admin/**").hasAnyRole("ADMIN").and()
      .httpBasic()
        .and()
    .csrf().disable();   
}
  1. 将“ ROLE_”添加到您的@PreAuthorize

例如:

@PreAuthorize("hasRole('ROLE_USER')")

或者

@PreAuthorize("hasRole('ROLE_ADMIN')")

然后它应该按预期工作。

此外,如果它仍然无法按预期工作,我建议为GroupedOpenApi每个角色创建两个单独的角色,并按超级角色的路径标识符(即ADMIN在您的情况下)隔离 api,并在相应的 antMatchers 上创建相应的安全配置(例如:.antMatchers("/rest/admin/**").hasAnyRole("ADMIN"))。当您在每个角色的路径上配置安全性以及为文档配置单独的 GroupedOpenApi 时,这应该可以工作。

PS:我会先尝试第一种方法,只使用第二种方法作为后备。

于 2020-08-10T17:27:40.123 回答