OpenAPI3 показывает методы, основанные на аутентификации Basi c через Spring Boot - PullRequest
5 голосов
/ 04 августа 2020

Я добавил эту зависимость в свое приложение 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 отображались только те методы, на которые у пользователя есть права.

Для определенного метода c используется этот тег для авторизации моего вызова: @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();
    }
}

Ответы [ 2 ]

2 голосов
/ 13 августа 2020

Я сомневаюсь, что это возможно, поскольку документация API создается во время запуска (я думаю).

Вместо этого вы можете добавить документацию, определяющую, какие учетные данные безопасности необходимы для каких вызовов API, I нашел упоминание об этом в https://github.com/springdoc/springdoc-openapi#adding -api-information-and-security-documentation

Итак, если пользователь может видеть страницу API, он также может видеть конечные точки у него нет доступа (например, / admin), но вы можете добавить к нему документацию о том, что конечная точка может быть доступна только администраторам.

1 голос
/ 10 августа 2020

Исходя из предоставленного вами описания, я бы порекомендовал следующее.

  1. Добавить специфику роли c безопасность на конечных точках:

например:

@Override
protected void configure(HttpSecurity http) throws Exception {
http
      .authorizeRequests()
        .antMatchers("/rest/admin/**").hasAnyRole("ADMIN").and()
      .httpBasic()
        .and()
    .csrf().disable();   
}
Добавьте 'ROLE_' к @PreAuthorize

например:

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

или

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

Тогда он должен работать как ожидается.

Кроме того, если он по-прежнему не работает должным образом, я бы предложил создать два отдельных GroupedOpenApi для каждой роли и отделить apis по идентификатору пути для супер-роли (например, ADMIN в ваш случай) и создайте соответствующие конфигурации безопасности на соответствующих antMatcher (например: .antMatchers("/rest/admin/**").hasAnyRole("ADMIN")). Это должно работать, тогда как вы настраиваете безопасность для путей для каждой роли, а также настраиваете отдельный GroupedOpenApi для документации.

PS: Я бы сначала попробовал 1-й подход и использовал только 2-й в качестве запасного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...