接上篇《Apache Shiro 接管Swagger認證授權》,有熱心網友反應Apache Shiro似乎太簡單。針對這個問題,個人不做任何評價(一切技術服務於需求)。今天主要分享內容為:在Spring Security下如何接管Swagger的認證授權工作。
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 。按下回車鍵後,頁面被跳轉到登錄頁面。
接下來,使用之前配置的賬號和密碼登錄(用戶名:user,密碼:password)。成功登錄後,便可瀏覽Swagger文檔頁面信息。
通過下面的動態圖片,你可以更直觀的瞭解測試過程:
5.總結
本文詳細介紹了在Spring Boot下,如果使用Spring Security接管Swagger默認的身份認證工作。通過與Apache Shiro管理Swagger認證授權會發現,Spring Security和Apache Shiro管理Swagger權限的邏輯基本一致,即將Swagger的URLs加入到各自的認證和授權過濾鏈中,當用戶訪問Swagger對應的資源時,Apache Shiro和Spring Security都會對當前請求路徑進行檢查(包括用戶是否登錄,當前用戶是否有權限訪問url)。