SpringBoot整合Shiro時出錯:
異常日志:
o.s.b.d.LoggingFailureAnalysisReporter: *************************** APPLICATION FAILED TO START *************************** Description: Parameter 0 of method authorizationAttributeSourceAdvisor in com.csair.etm.manage.configuration.ShiroConfiguration required a bean named 'authenticator' that could not be found. Action: Consider defining a bean named 'authenticator' in your configuration.
分析原因 :
1: 你可能使用了網上的 SSM 整合 Shiro代碼,
2: 你使用了較新的Shiro 版本,
不同的依賴解決的辦法不用,當前有兩種整合方式:
解決辦法一
下面依賴解決辦法
<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-web-starter</artifactId> <version>1.5.1</version> </dependency>
上面的依賴 由於使用 了自動配置, 還導入了Servlet支持, 可能出現thymleaf不兼容的情況
部分依賴如下:
<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
解決辦法:
import org.apache.shiro.mgt.SecurityManager; @Configuration public class ShiroConfig { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Bean public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) { logger.info("啟動shiroFilter--時間是:" + new Date()); ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); //shiro攔截器 Map<String,String> filterChainDefinitionMap = new LinkedHashMap<String,String>(); //<!-- authc:所有url都必須認證通過才可以訪問; anon:所有url都都可以匿名訪問--> //<!-- 過濾鏈定義,從上向下順序執行,一般將/**放在最為下邊 --> // 配置不被攔截的資源及鏈接 filterChainDefinitionMap.put("/static/**", "anon"); // 退出過濾器 filterChainDefinitionMap.put("/logout", "logout"); // 如果不設置默認會自動尋找Web工程根目錄下的"/login"頁面,即本文使用的login.html shiroFilterFactoryBean.setLoginUrl("/login"); // 登錄成功后要跳轉的鏈接 shiroFilterFactoryBean.setSuccessUrl("/index"); //未授權界面 shiroFilterFactoryBean.setUnauthorizedUrl("/403"); //配置需要認證權限的 filterChainDefinitionMap.put("/**", "authc"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroFilterFactoryBean; } //自定義身份認證Realm(包含用戶名密碼校驗,權限校驗等) @Bean public MyShiroRealm myShiroRealm(){ MyShiroRealm myShiroRealm = new MyShiroRealm(); return myShiroRealm; } @Bean(name = "securityManager")// 容器中自動配置了SecurityManager 所以我們使用SessionSecurityManager 覆蓋 public SessionSecurityManager securityManager(){ DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(myShiroRealm()); return securityManager; } //開啟shiro aop注解支持,不開啟的話權限驗證就會失效 @Bean public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager){ AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor(); authorizationAttributeSourceAdvisor.setSecurityManager(securityManager); return authorizationAttributeSourceAdvisor; } //配置異常處理,不配置的話沒有權限后台報錯,前台不會跳轉到403頁面 @Bean(name="simpleMappingExceptionResolver") public SimpleMappingExceptionResolver createSimpleMappingExceptionResolver() { SimpleMappingExceptionResolver simpleMappingExceptionResolver = new SimpleMappingExceptionResolver(); Properties mappings = new Properties(); mappings.setProperty("DatabaseException", "databaseError");//數據庫異常處理 mappings.setProperty("UnauthorizedException","403"); simpleMappingExceptionResolver.setExceptionMappings(mappings); // None by default simpleMappingExceptionResolver.setDefaultErrorView("error"); // No default simpleMappingExceptionResolver.setExceptionAttribute("ex"); // Default is "exception" return simpleMappingExceptionResolver; } }
application.xml 增加配置
spring.main.allow-bean-definition-overriding=true
解決辦法二:
如果你導入了 以下依賴
<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.5.1</version> </dependency>
則使用下面的配置文件:
@Configuration public class ShiroConfig { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Bean("shiroFilterFactoryBean") public ShiroFilterFactoryBean shirFilter(@Qualifier("securityManager")SecurityManager securityManager) { logger.info("啟動shiroFilter--時間是:" + new Date()); ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); //shiro攔截器 Map<String,String> filterChainDefinitionMap = new LinkedHashMap<String,String>(); //<!-- authc:所有url都必須認證通過才可以訪問; anon:所有url都都可以匿名訪問--> //<!-- 過濾鏈定義,從上向下順序執行,一般將/**放在最為下邊 --> // 如果不設置默認會自動尋找Web工程根目錄下的"/login"頁面,即本文使用的login.html shiroFilterFactoryBean.setLoginUrl("/login"); // 登錄成功后要跳轉的鏈接 shiroFilterFactoryBean.setSuccessUrl("/main"); //錯誤頁面,認證不通過跳轉 shiroFilterFactoryBean.setUnauthorizedUrl("/error"); //未授權界面 shiroFilterFactoryBean.setUnauthorizedUrl("/403"); // 配置不被攔截的資源及鏈接 filterChainDefinitionMap.put("/static/**", "anon"); // 退出過濾器 filterChainDefinitionMap.put("/logout", "logout"); //開啟注冊頁面不需要權限 filterChainDefinitionMap.put("/register", "anon"); filterChainDefinitionMap.put("/user/login", "anon"); filterChainDefinitionMap.put("/user/register", "anon"); //配置需要認證權限的 filterChainDefinitionMap.put("/user/**", "authc"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroFilterFactoryBean; } /** * 配置shiro的生命周期 * @return */ @Bean public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() { return new LifecycleBeanPostProcessor(); } //自定義身份認證Realm(包含用戶名密碼校驗,權限校驗等) @Bean public ShiroRealm myShiroRealm(){ ShiroRealm myShiroRealm = new ShiroRealm(); return myShiroRealm; } @Bean public ShiroDialect shiroDialect() { return new ShiroDialect(); } @Bean(name = "securityManager") public SecurityManager securityManager(){ DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(myShiroRealm()); return securityManager; } //開啟shiro aop注解支持,不開啟的話權限驗證就會失效 @Bean public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() { DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator(); defaultAdvisorAutoProxyCreator.setProxyTargetClass(true); return defaultAdvisorAutoProxyCreator; } @Bean public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(@Qualifier("securityManager") SecurityManager securityManager) { AuthorizationAttributeSourceAdvisor sourceAdvisor = new AuthorizationAttributeSourceAdvisor(); sourceAdvisor.setSecurityManager(securityManager); return sourceAdvisor; } //配置異常處理,不配置的話沒有權限后台報錯,前台不會跳轉到403頁面 @Bean(name="simpleMappingExceptionResolver") public SimpleMappingExceptionResolver createSimpleMappingExceptionResolver() { SimpleMappingExceptionResolver simpleMappingExceptionResolver = new SimpleMappingExceptionResolver(); Properties mappings = new Properties(); mappings.setProperty("DatabaseException", "databaseError");//數據庫異常處理 mappings.setProperty("UnauthorizedException","403"); simpleMappingExceptionResolver.setExceptionMappings(mappings); // None by default simpleMappingExceptionResolver.setDefaultErrorView("403"); // No default simpleMappingExceptionResolver.setExceptionAttribute("ex"); // Default is "exception" return simpleMappingExceptionResolver; } }