Добавить Swagger Basic AUTH в приложение Spring Boot - PullRequest
0 голосов
/ 25 апреля 2018

Требования:

  • Приложение Spring Boot с Springfox
  • Добавить BASIC-аутентификацию в Swagger
  • Передача всех остальных запросов

Код: реализован

@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");
    }
}

Этот код, однако, не работает - вы можете свободно просматривать /swagger-ui.html#/ без какой-либо аутентификации.

Вопрос в том, почему BASIC-аутентификация и пользователь делаютне относится к конечной точке пользовательского интерфейса Swagger?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Вы должны использовать .authenticated() вместо .permitAll():

.authorizeRequests()
    .antMatchers("/swagger-resources/*", "*.html", "/api/v1/swagger.json")
        .hasRole("SWAGGER")
    .anyRequest()
        .authenticated()

Это будет:

  • Ограничить доступ ко всем ресурсам, соответствующим /swagger-resources/*, *.html и /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, но вы пренебрегали тем, что по умолчанию они уже имеют к нему доступ. Точнее, каждый имеет к нему доступ, если не указано иное .

Используя .authenticated(). вы говорите Spring, что хотите, чтобы все соответствующие запросы были разрешены только для людей с правильными role или authority.

Новая конфигурация:

.authorizeRequests() // allow requests
    .antMatchers(...) // that matches this
        .hasRole("SWAGGER") // with role SWAGGER
    .anyRequest() // all requests above
        .authenticated() // needs authentication

Обновление

Относительно вашей проблемы с /swagger-resources, /swagger-resources/configuration/security и swagger-resources/configuration/ui, возвращающими 401:

Вам следует заменить /swagger-resources/* на /swagger-resources/**.

Обновление 2

Добавьте следующее в end вашей конфигурации, чтобы разрешить все несопоставленные запросы:

.authorizeRequests()
    .anyRequest()
        .permitAll();
0 голосов
/ 25 апреля 2018

Ваша конфигурация странная. Вы можете попробовать что-то вроде этого:

public static void configure(HttpSecurity http) throws Exception {
    http.csrf().disable()
    .antMatcher("/swagger-ui.html")
    .authorizeRequests()
        .anyRequest().hasAnyRole("SWAGGER")
        .and()
    .httpBasic();
}

Это обеспечивает авторизацию для пути swagger-ui.html (с ролью SWAGGER).

...