[Swagger] Auf die Integration von Swagger und Knife4j in Spring Security kann nicht zugegriffen werden und das zurückgegebene Ergebnis hat keinen Inhalt

Als Programmierer mit schwerer Zwangsstörung möchte ich kein zusätzliches JAR-Paket importieren

Der Hintergrund dieses Artikels ist, dass es sich bei den meisten Online-Tutorials um alte Versionen von Swagger2 handelt und der Unterschied zwischen 2 und 3 nicht beschrieben wird. Kommen wir also direkt zum Thema, ohne viel zu sagen.

Der richtige Weg, Pakete zu importieren

Wenn Sie nur das Messer4j-Dokument als Leitfaden für dieses Paket benötigen , finden Sie hier ein Beispiel für Version 3.0+
(Studenten, die mit Springboot besser vertraut sind, sollten wissen, dass der Zweck des Starters darin besteht, andere Pakete in ein Paket zu integrieren, um sie außerhalb des Pakets zu verwenden). -Box verwenden. Ein korrekter Stater wird andere Pakete enthalten.

		<!-- 如果只需要knife4j文档 导这一个包就够了 -->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>

Wenn Sie gleichzeitig die Swagger-Schnittstelle verwenden möchten, müssen Sie ein zusätzliches Paket hinzufügen :

        <!--可选,引入后,原/swagger-ui.html提供的页面仍可正常使用-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>3.0.0</version>
        </dependency>

Wenn Sie Knife4j nicht verwenden möchten, sondern nur Swagger verwenden möchten und das obige Paket nicht benötigen, benötigen Sie nur das folgende Paket:

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>

Dieser Artikel basiert auf dem JAR-Paket der Sicherheitsumgebungssicherheit :


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

swagger2-Releases im Sicherheitsbereich

In swagger2 ist unsere Release-Haltung laut den meisten Tutorials ein klassisches vierteiliges Set:

/webjars/**
/swagger-resources/**
/v2/**
/swagger-ui/**

Das Codebeispiel lautet wie folgt:

@Configuration
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
    
    

    /** WebSecurity 不走过滤链的放行  即不通过security 完全对外的/最大级别的放行 **/
    @Override
    public void configure(WebSecurity web) throws Exception {
    
    
          // test直接放行了  如果是login接口 必须通过HttpSecurity 走过滤链 因为登录涉及 SecurityContextHolder
        web.ignoring().antMatchers("/test/**");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
    
    
        // 登录成功处理类
        SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
        successHandler.setTargetUrlParameter("redirectTo");

        http.authorizeRequests()
                //静态文件允许访问
                .antMatchers("/assets/**").permitAll()
                .antMatchers("/webjars/**").permitAll()
                .antMatchers("/swagger-resources/**").permitAll()
                .antMatchers("/v2/**").permitAll()
                
                .antMatchers(  "/swagger-ui/**").permitAll()
                // 放行
                .antMatchers( "/login","css/**","/js/**","/image/*").permitAll()
                //其他所有请求需要登录, anyRequest 不能配置在 antMatchers 前面
                .anyRequest().authenticated()
                .and()
                //登录页面配置,用于替换security默认页面
//                .formLogin().loginPage(  "/login").successHandler(successHandler).and()
                //登出页面配置,用于替换security默认页面
//                .logout().logoutUrl( "/logout").and()
                .httpBasic();

    }
}

Dieser Code ist grundsätzlich korrekt, es gibt jedoch eine versteckte Gefahr: /v2/ **
Wenn einige Schüler auf die Entwicklung der Version v2 stoßen und die Schnittstelle mit /v2 starten, hat dies schwerwiegende Folgen, daher empfiehlt
der Blogger, nicht zu schreiben Um Ärger zu vermeiden, ist es am besten, das Ganze zu schreiben: /v2/api-docs


Swagger3-Releases im Sicherheitsbereich

Wenn unsere Version eines Tages mithilfe der obigen Konfiguration schrittweise auf Swagger3 aktualisiert wird, werden wir feststellen, dass weder Swagger noch Knife darauf zugreifen können. Warum?

Hier ist die Analyse des Bloggers:

Ursachenanalyse des fehlgeschlagenen Release von Knife4j:

Andere Konfigurationen haben sich nicht geändert , aber der durch das Upgrade der Starterversion verursachte Release-Fehler kann im Allgemeinen auf zwei Gründe zurückzuführen sein:

  1. Der Sicherheitsmechanismus zum Ändern der korrekten Freigabeposition ist nicht mehr vorhanden

             http.authorizeRequests()
             .antMatchers("/xxx/**").permitAll()
    

    Aber wir sollten verstehen, dass Swagger nur ein zusätzliches Dokumentationstool ist und den Sicherheitsmechanismus nicht verändern sollte, sodass wir es ausschließen können

  2. Wenn die Veröffentlichung fehlschlägt, bedeutet dies, dass die URL blockiert ist. Wenn die URL blockiert ist, bedeutet dies, dass sich die Dokumentadresse nach dem Upgrade möglicherweise geändert hat.

  3. Wir können also zuerst das Sicherheits-JAR-Paket entfernen und die Dokumentationsseite von Knife4j beobachten:
    Fügen Sie hier eine Bildbeschreibung ein

Daraus können wir erkennen, dass wir eine neue Zeile Release-Code hinzufügen müssen:

      .antMatchers("/v3/api-docs").permitAll()

Fügen Sie dann das Sicherheitspaket wieder zum Projekt hinzu

Ursachenanalyse des Swagger-Zugriffsfehlers:

Das liegt an der URL-Änderung an Knife4j. Ist es also möglich, dass Swagger auftritt?

Unsere bisherige (swagger2) Zugriffs-URL lautet

localhost:8080/swagger-ui.html

Woher kommt diese Adresse?

Fügen Sie hier eine Bildbeschreibung ein
html ist im swagger-ui-JAR-Paket enthalten

Dann schauen Sie sich an, was in swagger3 daraus geworden ist:
Fügen Sie hier eine Bildbeschreibung ein

Richtig, der Name hat sich geändert und unsere korrekte Zugriffs-URL in swagger3 lautet:

localhost:8080/swagger-ui/index.html

Fügen Sie hier eine Bildbeschreibung ein

Antwortergebnisse weisen keine inhaltlichen Probleme auf

Wenn wir beispielsweise eine Result-Klasse als einheitliche Rückgabeergebnisklasse kapseln, müssen wir den generischen Typ vervollständigen, wie zum Beispiel:

public Result<People> getPeopleList(){
    
    
	return new Result(xxxx)
}

Guess you like

Origin blog.csdn.net/qq_36268103/article/details/128812422