web-dev-qa-db-ja.com

SpringBootアプリにSwaggerBasicAUTHを追加します

要件:

  • Springfoxを使用したSpringBootアプリケーション
  • SwaggerにBASIC認証を追加する
  • 他のすべてのリクエストを渡す

コード:実装

@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認証とユーザーがSwaggerUIエンドポイントに適用されないのですか?

4
Cortlendt

.authenticated()の代わりに.permitAll()を使用する必要があります。

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

この意志:

  • _/swagger-resources/*_、_*.html_、および_/api/v1/swagger.json_に一致するすべてのリソースへのアクセスを制限します

  • 他のすべてのリソースへの認証されていないアクセスを許可する

構成が機能しない理由を明確にするために、それはあなたがそれを読むべきであるようにあなたが春のセキュリティを読んでいないからです。

古い構成は次のようになります。

_.authorizeRequests() // allow requests
    .antMatchers(...) // that matches this
        .hasAuthority("SWAGGER") // with SWAGGER authority
    .anyRequest() // All requests above
        .permitAll() // grant full access 
_

つまり、SWAGGER権限を持つユーザーにフルアクセスを許可していますが、無視しているのは、デフォルトでは、ユーザーはすでにアクセスできるということです。より正確には、すべての人は、特に指定しない限り、それにアクセスできます

.authenticated()を使用する。一致するすべてのリクエストを適切なroleまたはauthorityを持つユーザーに制限するようにSpringに指示しています。

新しい構成:

_.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();
_
4
TwiN

あなたの設定は奇妙です。あなたはそのようなことを試すことができます:

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ロールを使用)への承認が保証されます。

0
Glim