springboot整合shiro后Swagger報404
//?SwaggerConfig? package?com.kaituo.common.swagger; import?com.google.common.base.Predicates; import?org.springframework.context.annotation.Bean; import?org.springframework.context.annotation.ComponentScan; import?org.springframework.context.annotation.Configuration; import?org.springframework.web.servlet.config.annotation.EnableWebMvc; import?org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import?org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; import?org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import?springfox.documentation.builders.ApiInfoBuilder; import?springfox.documentation.builders.PathSelectors; import?springfox.documentation.builders.RequestHandlerSelectors; import?springfox.documentation.service.ApiInfo; import?springfox.documentation.service.Contact; import?springfox.documentation.spi.DocumentationType; import?springfox.documentation.spring.web.plugins.Docket; import?springfox.documentation.swagger2.annotations.EnableSwagger2; /** ?*?swagger?接口文檔工具 ?*?@Author:?RenShuai ?*?@Classname?SwaggerConfig ?*?@Package?com.kaituo.common.swagger ?*?@Date?2019/8/28?13:48 ?*?@Version?V1.0 ?*?@address?:?http://localhost:7100/swagger-ui.html ?*/ @Configuration @EnableWebMvc @EnableSwagger2 @ComponentScan(basePackages?=?{?"com.kaituo.common.*"?}) public?class?SwaggerConfig?implements?WebMvcConfigurer?{ ????/** ?????*?創(chuàng)建一個Docket對象 ?????*?調(diào)用select()方法, ?????*?生成ApiSelectorBuilder對象實例,該對象負(fù)責(zé)定義外漏的API入口 ?????*?通過使用RequestHandlerSelectors和PathSelectors來提供Predicate,在此我們使用any()方法,將所有API都通過Swagger進(jìn)行文檔管理 ?????*?@return ?????*/ ????@Bean ????public?Docket?createRestApi()?{ ????????return?new?Docket(DocumentationType.SWAGGER_2) ????????????????.apiInfo(apiInfo()) ????????????????.select() ????????????????.apis(RequestHandlerSelectors.any()) ????????????????.paths(Predicates.not(PathSelectors.regex("/error.*")))//錯誤路徑不監(jiān)控 ????????????????.paths(PathSelectors.any()) ????????????????.build(); ????} ????private?ApiInfo?apiInfo()?{ ????????return?new?ApiInfoBuilder() ????????????????//標(biāo)題 ????????????????.title("科研項目接口文檔") ????????????????//簡介 ????????????????.description("") ????????????????//服務(wù)條款 ????????????????.termsOfServiceUrl("") ????????????????//作者個人信息 ????????????????.contact(new?Contact("renshuai","","xxx@xxx.com")) ????????????????//版本 ????????????????.version("1.0") ????????????????.build(); ????} ????@Override ????public?void?addResourceHandlers(ResourceHandlerRegistry?registry)?{ //????????registry.addResourceHandler("/**").addResourceLocations("classpath*:/static/"); ????????registry.addResourceHandler("swagger-ui.html") ????????????????.addResourceLocations("classpath:/META-INF/resources/"); ????????registry.addResourceHandler("/webjars/**") ????????????????.addResourceLocations("classpath:/META-INF/resources/webjars/"); //????????super.addResourceHandlers(registry); ????} }
shiro的配置
package?com.kaituo.shiro.configs; import?com.kaituo.pojo.bo.ShiroBO; import?org.apache.shiro.authc.credential.HashedCredentialsMatcher; import?org.apache.shiro.mgt.SecurityManager; import?org.apache.shiro.session.mgt.eis.MemorySessionDAO; import?org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; import?org.apache.shiro.spring.web.ShiroFilterFactoryBean; import?org.apache.shiro.web.mgt.DefaultWebSecurityManager; import?org.apache.shiro.web.session.mgt.DefaultWebSessionManager; import?org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; import?org.springframework.beans.factory.annotation.Autowired; import?org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import?org.springframework.context.annotation.Bean; import?org.springframework.context.annotation.Configuration; import?java.util.LinkedHashMap; import?java.util.Map; /** ?*?@program:?scaffold ?*?@description: ?*?@author:?由蘇澤華創(chuàng)建 ?*?@create:?2019-09-29?14:04 ?**/ @Configuration public?class?ShiroConfig?{ ????@Autowired ????ShiroBO?shiroBO; ????@Bean ????@ConditionalOnMissingBean ????public?DefaultAdvisorAutoProxyCreator?defaultAdvisorAutoProxyCreator()?{ ????????DefaultAdvisorAutoProxyCreator?app?=?new?DefaultAdvisorAutoProxyCreator(); ????????app.setProxyTargetClass(true); ????????return?app; ????} ????@Bean(name?=?"shiroFilter") ????public?ShiroFilterFactoryBean?shiroFilter()?{ ????????ShiroFilterFactoryBean?shiroFilterFactoryBean?=?new?ShiroFilterFactoryBean(); ????????shiroFilterFactoryBean.setSecurityManager(securityManager()); ????????//登錄 //????????shiroFilterFactoryBean.setLoginUrl("/login"); ????????//未授權(quán)界面,聽說這個有問題。是個坑 //????????shiroFilterFactoryBean.setUnauthorizedUrl("/notRole"); ????????Map<String,?String>?filterChainDefinitionMap?=?new?LinkedHashMap<>(); ????????//?<!--?authc:所有url都必須認(rèn)證通過才可以訪問;?anon:所有url都都可以匿名訪問--> ????????filterChainDefinitionMap.put("classpath:/static/**",?"anon"); ????????filterChainDefinitionMap.put("/css/**",?"anon"); ????????filterChainDefinitionMap.put("/js/**",?"anon"); ????????filterChainDefinitionMap.put("/img/**",?"anon"); ????????filterChainDefinitionMap.put("/favicon.ico",?"anon"); ????????filterChainDefinitionMap.put("/swagger-ui.html",?"anon"); ????????filterChainDefinitionMap.put("/swagger/**","anon"); ????????filterChainDefinitionMap.put("/webjars/**",?"anon"); ????????filterChainDefinitionMap.put("/swagger-resources/**","anon"); ????????filterChainDefinitionMap.put("/v2/**","anon"); ????????filterChainDefinitionMap.put("/configuration/**",?"anon"); ????????filterChainDefinitionMap.put("/configuration/security",?"anon"); ????????filterChainDefinitionMap.put("/configuration/ui",?"anon"); ????????filterChainDefinitionMap.put("/login",?"anon"); ????????filterChainDefinitionMap.put("/api/**",?"anon"); ????????filterChainDefinitionMap.put("/logout",?"anon"); ????????filterChainDefinitionMap.put("/admin/**",?"authc"); ????????filterChainDefinitionMap.put("/user/**",?"authc"); ????????//主要這行代碼必須放在所有權(quán)限設(shè)置的最后,不然會導(dǎo)致所有?url?都被攔截?剩余的都需要認(rèn)證 //????????filterChainDefinitionMap.put("/**",?"authc"); ????????shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); ????????return?shiroFilterFactoryBean; ????} ????/** ?????*?創(chuàng)建securityManger對象 ?????* ?????*?@param ?????*?@Description:?創(chuàng)建securityManger對象 ?????*?@Param: ?????*?@return:?org.apache.shiro.web.mgt.DefaultWebSecurityManager ?????*?@Author:?蘇澤華 ?????*?@Date:?2019/1/10 ?????*/ ????@Bean ????public?SecurityManager?securityManager()?{ ????????DefaultWebSecurityManager?securityManager?=?new?DefaultWebSecurityManager(); ????????securityManager.setSessionManager(sessionManager()); ????????//?TODO:?2019/8/29 //????????securityManager.setCacheManager(redisCacheManager()); ????????securityManager.setRealm(realm()); ????????return?securityManager; ????} ????@Bean ????public?DefaultWebSessionManager?sessionManager()?{ ????????DefaultWebSessionManager?sessionManager?=?new?DefaultWebSessionManager(); ????????sessionManager.setSessionDAO(sessionDAO()); ????????sessionManager.setDeleteInvalidSessions(true); ????????sessionManager.setGlobalSessionTimeout(shiroBO.getShiroSessionTimeout()); ????????sessionManager.setSessionValidationInterval(shiroBO.getShiroSessionValidationInterval()); ????????sessionManager.setSessionValidationSchedulerEnabled(true); ????????return?sessionManager; ????} ????@Bean ????public?MemorySessionDAO?sessionDAO()?{ ????????MemorySessionDAO?memorySessionDAO?=?new?MemorySessionDAO(); ????????return?memorySessionDAO; ????} ????/** ?????*?創(chuàng)建密碼驗證器 ?????* ?????*?@param ?????*?@Description:?創(chuàng)建密碼驗證器 ?????*?@Param: ?????*?@return:?org.apache.shiro.authc.credential.HashedCredentialsMatcher ?????*?@Author:?蘇澤華 ?????*?@Date:?2019/1/10 ?????*/ ????@Bean ????public?HashedCredentialsMatcher?credentialsMatcher()?{ ????????HashedCredentialsMatcher?hashedCredentialsMatcher?=?new?HashedCredentialsMatcher(); ????????hashedCredentialsMatcher.setHashAlgorithmName(shiroBO.getHashAlgorithmName()); ????????hashedCredentialsMatcher.setHashIterations(shiroBO.getHashIterations()); ????????return?hashedCredentialsMatcher; ????} ????/** ?????*?* ?????*?開啟Shiro的注解(如@RequiresRoles,@RequiresPermissions),需借助SpringAOP掃描使用Shiro注解的類,并在必要時進(jìn)行安全邏輯驗證 ?????*?* ?????*?配置以下兩個bean(DefaultAdvisorAutoProxyCreator(可選)和AuthorizationAttributeSourceAdvisor)即可實現(xiàn)此功能 ?????*?*?@return ?????*/ //????@Bean //????@DependsOn({"lifecycleBeanPostProcessor"}) //????public?DefaultAdvisorAutoProxyCreator?advisorAutoProxyCreator()?{ //????????DefaultAdvisorAutoProxyCreator?advisorAutoProxyCreator?=?new?DefaultAdvisorAutoProxyCreator(); //????????advisorAutoProxyCreator.setProxyTargetClass(true); //????????return?advisorAutoProxyCreator; //????} ????@Bean ????public?AuthorizationAttributeSourceAdvisor?authorizationAttributeSourceAdvisor()?{ ????????AuthorizationAttributeSourceAdvisor?authorizationAttributeSourceAdvisor?=?new?AuthorizationAttributeSourceAdvisor(); ????????authorizationAttributeSourceAdvisor.setSecurityManager(securityManager()); ????????return?authorizationAttributeSourceAdvisor; ????} ????/** ?????*?創(chuàng)建realm ?????* ?????*?@param ?????*?@Description:?創(chuàng)建realm ?????*?@Param: ?????*?@return:?com.company.shiro.realm.TestCustomRealm ?????*?@Author:?蘇澤華 ?????*?@Date:?2019/1/10 ?????*/ ????@Bean ????public?CustomRealm?realm()?{ ????????CustomRealm?realm?=?new?CustomRealm(); ????????realm.setShiroBO(shiroBO); ????????realm.setCredentialsMatcher(credentialsMatcher()); ????????return?realm; ????} }
錯誤信息
已經(jīng)整了兩天了