認証なしでSwaggerURLにアクセスできるようにSpringSecurityを構成する方法


97

私のプロジェクトにはSpringSecurityがあります。主な問題:http:// localhost:8080 / api / v2 / api-docsでSwaggerURLにアクセスできません。承認ヘッダーがないか無効です。

ブラウザウィンドウのスクリーンショット 私のpom.xmlには次のエントリがあります

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.4.0</version>
</dependency>

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.4.0</version>
</dependency>

SwaggerConfig:

@Configuration
@EnableSwagger2
public class SwaggerConfig {

@Bean
public Docket api() {
    return new Docket(DocumentationType.SWAGGER_2).select()
            .apis(RequestHandlerSelectors.any())
            .paths(PathSelectors.any())
            .build()
            .apiInfo(apiInfo());
}

private ApiInfo apiInfo() {
    ApiInfo apiInfo = new ApiInfo("My REST API", "Some custom description of API.", "API TOS", "Terms of service", "myeaddress@company.com", "License of API", "API license URL");
    return apiInfo;
}

AppConfig:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "com.musigma.esp2" })
@Import(SwaggerConfig.class)
public class AppConfig extends WebMvcConfigurerAdapter {

// ========= Overrides ===========

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new LocaleChangeInterceptor());
}

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("swagger-ui.html")
      .addResourceLocations("classpath:/META-INF/resources/");

    registry.addResourceHandler("/webjars/**")
      .addResourceLocations("classpath:/META-INF/resources/webjars/");
}

web.xmlエントリ:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        com.musigma.esp2.configuration.AppConfig
        com.musigma.esp2.configuration.WebSecurityConfiguration
        com.musigma.esp2.configuration.PersistenceConfig
        com.musigma.esp2.configuration.ACLConfig
        com.musigma.esp2.configuration.SwaggerConfig
    </param-value>
</context-param>

WebSecurityConfig:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
@ComponentScan(basePackages = { "com.musigma.esp2.service", "com.musigma.esp2.security" })
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
        .csrf()
            .disable()
        .exceptionHandling()
            .authenticationEntryPoint(this.unauthorizedHandler)
            .and()
        .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
        .authorizeRequests()
            .antMatchers("/auth/login", "/auth/logout").permitAll()
            .antMatchers("/api/**").authenticated()
            .anyRequest().authenticated();

        // custom JSON based authentication by POST of {"username":"<name>","password":"<password>"} which sets the token header upon authentication
        httpSecurity.addFilterBefore(loginFilter(), UsernamePasswordAuthenticationFilter.class);

        // custom Token based authentication based on the header previously given to the client
        httpSecurity.addFilterBefore(new StatelessTokenAuthenticationFilter(tokenAuthenticationService), UsernamePasswordAuthenticationFilter.class);
    }
}

回答:


180

これをWebSecurityConfigurationクラスに追加すると、うまくいくはずです。

@Configuration
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/v2/api-docs",
                                   "/configuration/ui",
                                   "/swagger-resources/**",
                                   "/configuration/security",
                                   "/swagger-ui.html",
                                   "/webjars/**");
    }

}

11
swagger-uiを使用する場合は、次のようなものが必要です:.antMatchers( "/ v2 / api-docs"、 "/ configuration / ui"、 "/ swagger-resources"、 "/ configuration / security"、 "/ swagger-ui .htmlを」、 "/ webjars / **"、 "/闊歩-リソース/設定/ UI"、 "/闊歩-ui.html")permitAll()。
ダニエル・マルティン

2
私の場合、このルールは機能しています:.antMatchers( "/ v2 / api-docs"、 "/ configuration / ui"、 "/ swagger-resources"、 "/ configuration / security"、 "/swagger-ui.html"、 "/ webjars / **"、 "/ swagger-resources / configuration / ui"、 "/ swagge‌ r-ui.html"、 "/ swagger-resources / configuration / security")。permitAll()
nikolai.serdiuk

6
さらに必要なルール:.antMatchers( "/"、 "/ csrf"、 "/ v2 / api-docs"、 "/ swagger-resources / configuration / ui"、 "/ configuration / ui"、 "/ swagger-resources"、 "/ swagger-resources / configuration / security"、 "/ configuration / security"、 "/swagger-ui.html"、 "/ webjars / **")。permitAll()
MateŠimović2018

5
答えてくれてありがとう!webjars / **へのアクセスを許可するセキュリティリスクはありますか?
ssimm

非常に役立つ回答
PraveenkumarBeedanal20年

26

/ configuration / **と/ swagger-resources / **で更新しましたが、うまくいきました。

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/v2/api-docs", "/configuration/ui", "/swagger-resources/**", "/configuration/**", "/swagger-ui.html", "/webjars/**");

}

完璧!問題を解決しました。
マドゥ

25

Spring Boot 2.0.0.M7 + Spring Security + Springfox2.8.0を使用しても同じ問題が発生しました。そして、SwaggerUIリソースへのパブリックアクセスを許可する次のセキュリティ構成を使用して問題を解決しました。

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    private static final String[] AUTH_WHITELIST = {
            // -- swagger ui
            "/v2/api-docs",
            "/swagger-resources",
            "/swagger-resources/**",
            "/configuration/ui",
            "/configuration/security",
            "/swagger-ui.html",
            "/webjars/**"
            // other public endpoints of your API may be appended to this array
    };


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.
                // ... here goes your custom security configuration
                authorizeRequests().
                antMatchers(AUTH_WHITELIST).permitAll().  // whitelist Swagger UI resources
                // ... here goes your custom security configuration
                antMatchers("/**").authenticated();  // require authentication for any endpoint that's not whitelisted
    }

}

2
このクラスを追加した後、swagger-uiを確認できますが、{ "timestamp": 1519798917075, "status": 403, "error": "Forbidden", "message": "Access Denied", "path": "/<some path>/shop" }
access_tokenを

@ChandrakantAudhutwarantMatchers("/**").authenticated()ステートメントを削除するか、独自の認証構成に置き換えます。注意してください、あなたはあなたがセキュリティで何をしているのかをよりよく知っています。
naXa 2018

はい、うまくいきました。swagger-uiをバイパスすることだけを考えていましたが、他のAPIは保護されているためです。現在、私のAPIもバイパスされています。
Chandrakant Audhutwar 2018

@ChandrakantAudhutwarSecurityConfigurationクラス全体をコピーしてプロジェクトに貼り付ける必要はありません。SecurityConfigurationSwagger UIリソースへのリクエストを許可し、APIを安全に保つための独自の場所が必要です。
naXa 2018

私がしているAuthorizationServerConfigurerAdapterAPI」の認証を行い、クラスを実装しました。
Chandrakant Audhutwar 2018

14

新しいSwagger3バージョンを使用している場合 org.springdoc:springdoc-openapi-ui

@Configuration
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/v3/api-docs/**", "/swagger-ui.html", "/swagger-ui/**");
    }
}

2
注:これで「AuthenticationRequired」エラーが発生せず、空白のページが表示される場合は、そのリストに「/ swagger-resources / **」と「/ swagger-resources」も追加する必要があり、修正されました。私にとってはそれ。
ヴィニシウスM20年

6

Springfoxのバージョンが2.5を超える場合は、次のようにWebSecurityConfigurationを追加する必要があります。

@Override
public void configure(HttpSecurity http) throws Exception {
    // TODO Auto-generated method stub
    http.authorizeRequests()
        .antMatchers("/v2/api-docs", "/swagger-resources/configuration/ui", "/swagger-resources", "/swagger-resources/configuration/security", "/swagger-ui.html", "/webjars/**").permitAll()
        .and()
        .authorizeRequests()
        .anyRequest()
        .authenticated()
        .and()
        .csrf().disable();
}

duliu1990は正しいです。springfox2.5以降以降、すべてのspringfoxリソース(swaggerを含む)は/swagger-resources。の下に移動しました。/v2/api-docsはデフォルトのSwaggerAPIエンドポイント(UIには関係ありません)であり、構成変数springfox.documentation.swagger.v2.path springfoxで
Mahieddine M.

4

多かれ少なかれこのページには答えがありますが、すべてが1か所にあるわけではありません。私は同じ問題を扱っていて、それにかなりの時間を費やしました。今、私はより良い理解を持っています、そして私はそれをここで共有したいと思います:

SpringWebセキュリティでSwaggerUIを有効にする:

Spring Websecurityをデフォルトで有効にしている場合、アプリケーションへのすべてのリクエストをブロックし、401を返します。ただし、swagger uiをブラウザーにロードするために、swagger-ui.htmlはデータを収集するためにいくつかの呼び出しを行います。デバッグする最良の方法は、ブラウザ(google chromeなど)でswagger-ui.htmlを開き、開発者向けオプション(「F12」キー)を使用することです。ページが読み込まれたときに行われたいくつかの呼び出しを確認できます。swagger-uiが完全に読み込まれていない場合は、それらの一部が失敗している可能性があります。

いくつかのSwaggerパスパターンの認証を無視するようにSpringWebsecurityに指示する必要がある場合があります。私はswagger-ui2.9.2を使用しています。私の場合、以下は無視しなければならなかったパターンです。

ただし、別のバージョンを使用している場合は、バージョンが変わる可能性があります。私が前に言ったようにあなたはあなたのブラウザの開発者オプションであなたを理解しなければならないかもしれません。

@Configuration
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/v2/api-docs", "/configuration/ui", 
            "/swagger-resources/**", "/configuration/**", "/swagger-ui.html"
            , "/webjars/**", "/csrf", "/");
}
}

IIインターセプターでSwaggerUIを有効にする

通常、swagger-ui.htmlによって行われたリクエストをインターセプトしたくない場合があります。以下のスワッガーのいくつかのパターンを除外するためのコードは次のとおりです。

Webセキュリティとインターセプターのほとんどのケースパターンは同じです。

@Configuration
@EnableWebMvc
public class RetrieveCiamInterceptorConfiguration implements WebMvcConfigurer {

@Autowired
RetrieveInterceptor validationInterceptor;

@Override
public void addInterceptors(InterceptorRegistry registry) {

    registry.addInterceptor(validationInterceptor).addPathPatterns("/**")
    .excludePathPatterns("/v2/api-docs", "/configuration/ui", 
            "/swagger-resources/**", "/configuration/**", "/swagger-ui.html"
            , "/webjars/**", "/csrf", "/");
}

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("swagger-ui.html")
      .addResourceLocations("classpath:/META-INF/resources/");

    registry.addResourceHandler("/webjars/**")
      .addResourceLocations("classpath:/META-INF/resources/webjars/");
}

}

@EnableWebMvcを有効にしてインターセプターを追加する必要がある場合があるため、上記のコードスニペットで行ったのと同様に、リソースハンドラーを追加してSwaggerする必要がある場合もあります。


なぜ/csrf除外を追加するのですか?
ヴィシャル

2

Swagger関連のリソースのみに制限:

.antMatchers("/v2/api-docs", "/swagger-resources/**", "/swagger-ui.html", "/webjars/springfox-swagger-ui/**");

2

これが、SpringSecurityを使用したSwaggerの完全なソリューションです。おそらく、開発環境とQA環境でのみSwaggerを有効にし、本番環境では無効にしたいでしょう。そのprop.swagger.enabledため、開発/ QA環境でのみswagger-uiのスプリングセキュリティ認証をバイパスするためのフラグとしてプロパティ()を使用しています。

@Configuration
@EnableSwagger2
public class SwaggerConfiguration extends WebSecurityConfigurerAdapter implements WebMvcConfigurer {

@Value("${prop.swagger.enabled:false}")
private boolean enableSwagger;

@Bean
public Docket SwaggerConfig() {
    return new Docket(DocumentationType.SWAGGER_2)
            .enable(enableSwagger)
            .select()
            .apis(RequestHandlerSelectors.basePackage("com.your.controller"))
            .paths(PathSelectors.any())
            .build();
}

@Override
public void configure(WebSecurity web) throws Exception {
    if (enableSwagger)  
        web.ignoring().antMatchers("/v2/api-docs",
                               "/configuration/ui",
                               "/swagger-resources/**",
                               "/configuration/security",
                               "/swagger-ui.html",
                               "/webjars/**");
}

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    if (enableSwagger) {
        registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
  }
}

1

Spring Boot 5を使用しています。認証されていないユーザーに呼び出してもらいたいこのコントローラーがあります。

  //Builds a form to send to devices   
@RequestMapping(value = "/{id}/ViewFormit", method = RequestMethod.GET)
@ResponseBody
String doFormIT(@PathVariable String id) {
    try
    {
        //Get a list of forms applicable to the current user
        FormService parent = new FormService();

これが私が設定でしたことです。

  @Override
   protected void configure(HttpSecurity http) throws Exception {
    http
            .authorizeRequests()
            .antMatchers(
                    "/registration**",
                    "/{^[\\\\d]$}/ViewFormit",

お役に立てれば....


0

のURLパターンで配置されたすべてのAPIリクエストを考慮すると、/api/..以下の構成を使用して、このURLパターンのみを保護するようにSpringに指示できます。つまり、何を無視するのではなく、何を保護するかをSpringに指示しているということです。

@Override
protected void configure(HttpSecurity http) throws Exception {
  http
    .csrf().disable()
     .authorizeRequests()
      .antMatchers("/api/**").authenticated()
      .anyRequest().permitAll()
      .and()
    .httpBasic().and()
    .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}

1
このコードスニペットをありがとうございます。これは、限られた短期的なヘルプを提供する可能性があります。適切な説明これが問題の良い解決策である理由を示すことによってその長期的な価値を大幅に改善し、他の同様の質問を持つ将来の読者にとってより役立つでしょう。あなたが行った仮定を含むいくつかの説明を追加するためにあなたの答えを編集してください。
Toby Speight 2018年

0

いくつかのセキュリティ構成とあなたはすべての人に闊歩を開く準備ができています

SwaggerV2の場合

@Configuration
@EnableWebSecurity
public class CabSecurityConfig extends WebSecurityConfigurerAdapter {


    private static final String[] AUTH_WHITELIST = {
            // -- swagger ui
            "/v2/api-docs", 
            "/swagger-resources/**", 
            "/configuration/ui",
            "/configuration/security", 
            "/swagger-ui.html",
            "/webjars/**"
    };

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        // ... here goes your custom security configuration
        http.authorizeRequests().
        antMatchers(AUTH_WHITELIST).permitAll(). // whitelist URL permitted
        antMatchers("/**").authenticated(); // others need auth
    }

}

SwaggerV3の場合

@Configuration
@EnableWebSecurity
public class CabSecurityConfig extends WebSecurityConfigurerAdapter {


    private static final String[] AUTH_WHITELIST = {
            // -- swagger ui
            "/v2/api-docs",
            "/v3/api-docs",  
            "/swagger-resources/**", 
            "/swagger-ui/**",
             };

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        // ... here goes your custom security configuration
        http.authorizeRequests().
        antMatchers(AUTH_WHITELIST).permitAll(). // whitelist URL permitted
        antMatchers("/**").authenticated(); // others need auth
    }

}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.