Consider defining a bean named 'authenticator' in your configuration.


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;
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM