Spring Security接管Swagger認證授權,我發現僅用了3行關鍵代碼!

接上篇《Apache Shiro 接管Swagger認證授權》,有熱心網友反應Apache Shiro似乎太簡單。針對這個問題,個人不做任何評價(一切技術服務於需求)。今天主要分享內容為:在Spring Security下如何接管Swagger的認證授權工作。

Spring Security接管Swagger認證授權,我發現僅用了3行關鍵代碼!

1.添加依賴

假定你對Swagger和Spring Security已經有一定的基礎,現在開始檢查你的項目中是否添加了Swagger和Spring Security的依賴。以Maven為例,向pom.xml文件添加如下配置信息:

<code>
    org.springframework.boot
    spring-boot-starter-security



    io.springfox
    springfox-swagger2
    2.9.2



    io.springfox
    springfox-swagger-ui
    2.9.2

/<code>

2.配置Swagger

Swagger的配置相對比較簡單,最主要的是配置其掃描的包路徑,其他信息可以選配。你可以按照下列方式進行配置:

<code>@Configuration
@EnableSwagger2
public class SwaggerConfiguration {

    @Bean
    public Docket docket(){
        return new Docket(DocumentationType.SWAGGER_2)
                .pathMapping("/")
                .select()
                .apis(
            RequestHandlerSelectors.basePackage("com.ramostear.apisecurity.controller"))
                .paths(PathSelectors.any())
                .build()
                .apiInfo(
                    new ApiInfoBuilder()
                    .title("Spring Security接管Swagger認證授權")
                    .description("Spring Security and Swagger")
                    .version("1.0.0")
                    .contact(
                        new Contact(
                            "樹下魅狐",
                            "https://www.ramostear.com",
                            "[email protected]"
                        )
                    ).build()
                );
    }
}
/<code>

Swagger的配置基本與上一篇的內容一致,只是調整了basePackage的路徑。

3.配置Spring Security

Spring Security的配置是本篇的重點。首先,基於內存設置兩個登錄時使用的賬號,然後再將Swagger的資源路徑添加到Spring Security的Authorize Filters中。創建Spring Security配置類,並添加如下代碼(如果你已經配置過Spring Security,且基於JDBC獲得登錄賬號信息,那麼可以省略賬戶的配置)。

SpringSecurityConfiguration.java

<code>@Configuration
@EnableWebSecurity
public class SpringSecurityConfiguration extends WebSecurityConfigurerAdapter {

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


    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .passwordEncoder(passwordEncoder())
            .withUser("user")
            .password(passwordEncoder().encode("password"))
            .roles("USER");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers(AUTH_LIST)
            .authenticated()
            .and()
            .formLogin()
            .and()
            .httpBasic();
    }

    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
}
/<code>

在配置類中,AUTH_LIST數組存放了Swagger需要加入Spring Security認證的URL:

<code>private static final String[] AUTH_LIST = {
      "/v2/api-docs",
      "/swagger-resources/**",
      "/swagger-ui.html",
      "/webjars/**"
    };
/<code>

這和Apache Shiro中的配置如出一轍,下面是Apache Shiro中配置Swagger的代碼:

<code>@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager){
    ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean();
    Map filterChainDefinition = new LinkedHashMap<>();
    filterChainDefinition.put("/swagger-ui.html","authc");
    filterChainDefinition.put("/v2/**","authc");
    filterChainDefinition.put("/swagger-resources/**","authc");
    filterFactoryBean.setFilterChainDefinitionMap(filterChainDefinition);
    return filterFactoryBean;
}
/<code>

讓Spring Security接管Swagger認證授權的核心是configure(HttpSecurity http)方法:

<code>@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
        .antMatchers(AUTH_LIST)
        .authenticated()
        .and()
        .httpBasic();
}
/<code>

只需將Swagger的相關URLs加入到Spring Security認證過濾鏈中即可。當未經認證的用戶訪問Swagger文檔時(
http://localhost:8080/swagger-ui.html),頁面將跳轉到用戶登錄頁面。

4.測試

現在,啟動應用程序,並在瀏覽器地址欄輸入:
http://localhost:8080/swagger-ui.html 。按下回車鍵後,頁面被跳轉到登錄頁面。

Spring Security接管Swagger認證授權,我發現僅用了3行關鍵代碼!

接下來,使用之前配置的賬號和密碼登錄(用戶名:user,密碼:password)。成功登錄後,便可瀏覽Swagger文檔頁面信息。

Spring Security接管Swagger認證授權,我發現僅用了3行關鍵代碼!

通過下面的動態圖片,你可以更直觀的瞭解測試過程:

Spring Security接管Swagger認證授權,我發現僅用了3行關鍵代碼!

5.總結

本文詳細介紹了在Spring Boot下,如果使用Spring Security接管Swagger默認的身份認證工作。通過與Apache Shiro管理Swagger認證授權會發現,Spring Security和Apache Shiro管理Swagger權限的邏輯基本一致,即將Swagger的URLs加入到各自的認證和授權過濾鏈中,當用戶訪問Swagger對應的資源時,Apache Shiro和Spring Security都會對當前請求路徑進行檢查(包括用戶是否登錄,當前用戶是否有權限訪問url)。



分享到:


相關文章: