shiro整合swagger的注意事項
swagger是一個很好的rest api管理工具,最近又整合了基于shiro的權限控制,出問題了,http://localhost:8080/swagger-ui.html訪問不正常,問題肯定是shiro沒放行導致的
shiro 配置
在shiroFilter中的配置如下:
@Bean(name = "shiroFilter") public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); //Shiro的核心安全接口,這個屬性是必須的 shiroFilterFactoryBean.setSecurityManager(securityManager); Map<String, Filter> filterMap = new LinkedHashMap<>(); filterMap.put("authc", new AjaxPermissionsAuthorizationFilter()); shiroFilterFactoryBean.setFilters(filterMap); /*定義shiro過濾鏈 Map結構 * Map中key(xml中是指value值)的第一個'/'代表的路徑是相對于HttpServletRequest.getContextPath()的值來的 * anon:它對應的過濾器里面是空的,什么都沒做,這里.do和.jsp后面的*表示參數,比方說login.jsp?main這種 * authc:該過濾器下的頁面必須驗證后才能訪問,它是Shiro內置的一個攔截器org.apache.shiro.web.filter.authc.FormAuthenticationFilter */ Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>(); /* 過濾鏈定義,從上向下順序執(zhí)行,一般將 / ** 放在最為下邊:這是一個坑呢,一不小心代碼就不好使了; authc:所有url都必須認證通過才可以訪問; anon:所有url都都可以匿名訪問 */ filterChainDefinitionMap.put("/", "anon"); filterChainDefinitionMap.put("/static/**", "anon"); filterChainDefinitionMap.put("/login/auth", "anon"); filterChainDefinitionMap.put("/login/logout", "anon"); filterChainDefinitionMap.put("/error", "anon"); filterChainDefinitionMap.put("/**", "authc"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroFilterFactoryBean; }
首先 常規(guī)的過濾放行如下:
filterChainDefinitionMap.put("/swagger-ui.html", "anon"); filterChainDefinitionMap.put("/swagger-resources", "anon"); filterChainDefinitionMap.put("/v2/api-docs", "anon"); filterChainDefinitionMap.put("/webjars/springfox-swagger-ui/**", "anon");
重新打開shiro,運行,swagger2頁面訪問正常,但是程序日志輸出依然有權限訪問出錯
于是繼續(xù)排查,受限請求如下:
http://localhost:8080/configuration/security http://localhost:8080/configuration/ui
所以繼續(xù)添加放行:
filterChainDefinitionMap.put("/configuration/security", "anon"); filterChainDefinitionMap.put("/configuration/ui", "anon");
最終配置為:
@Bean(name = "shiroFilter") public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); //Shiro的核心安全接口,這個屬性是必須的 shiroFilterFactoryBean.setSecurityManager(securityManager); Map<String, Filter> filterMap = new LinkedHashMap<>(); filterMap.put("authc", new AjaxPermissionsAuthorizationFilter()); shiroFilterFactoryBean.setFilters(filterMap); /*定義shiro過濾鏈 Map結構 * Map中key(xml中是指value值)的第一個'/'代表的路徑是相對于HttpServletRequest.getContextPath()的值來的 * anon:它對應的過濾器里面是空的,什么都沒做,這里.do和.jsp后面的*表示參數,比方說login.jsp?main這種 * authc:該過濾器下的頁面必須驗證后才能訪問,它是Shiro內置的一個攔截器org.apache.shiro.web.filter.authc.FormAuthenticationFilter */ Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>(); /* 過濾鏈定義,從上向下順序執(zhí)行,一般將 / ** 放在最為下邊:這是一個坑呢,一不小心代碼就不好使了; authc:所有url都必須認證通過才可以訪問; anon:所有url都都可以匿名訪問 */ filterChainDefinitionMap.put("/", "anon"); filterChainDefinitionMap.put("/static/**", "anon"); filterChainDefinitionMap.put("/login/auth", "anon"); filterChainDefinitionMap.put("/login/logout", "anon"); filterChainDefinitionMap.put("/error", "anon"); //swagger放行 filterChainDefinitionMap.put("/swagger-ui.html", "anon"); filterChainDefinitionMap.put("/swagger-resources", "anon"); filterChainDefinitionMap.put("/v2/api-docs", "anon"); filterChainDefinitionMap.put("/webjars/springfox-swagger-ui/**", "anon"); filterChainDefinitionMap.put("/configuration/security", "anon"); filterChainDefinitionMap.put("/configuration/ui", "anon"); filterChainDefinitionMap.put("/**", "authc"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroFilterFactoryBean; }
注意:filterChainDefinitionMap.put("/**", "authc") 需要放置在最后面。
最終結果: 訪問http://localhost:8080/api/swagger-ui.html出現
以上就是shiro整合swagger需要注意的地方的詳細內容,更多關于shiro整合swagger的資料請關注腳本之家其它相關文章!
相關文章
Spring?IoC容器Bean作用域的singleton與prototype使用配置
這篇文章主要為大家介紹了Spring?IoC容器Bean作用域的singleton與prototype使用配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12