Springboot整合Shiro的错误记录:Could not autowire. There is more than one bean of ‘Realm

简介: 今天在学习springboot整合shiro,在学习到创建安全管理器的时候出现了如下的错误,刚开始百思不得其解?


今天在学习springboot整合shiro,在学习到创建安全管理器的时候出现了如下的错误,刚开始百思不得其解?


1.JPG

2.JPG


我用我蹩脚的四级英语大概的读了一下,意思是无法自动配置,“realm”类型的bean不止一个 ,原来是类型为realm的类不止一个,spring无法自动注入。


package com.config;
import com.shiro.BaseRealm;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import java.util.HashMap;
//用来整合sshiro相关的类
@Configuration
public class ShiroConfigBase {
    //1.创建shiro
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultSecurityManager defaultSecurityManager){
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        //给filter设置安全管理器,负责拦截所有请求
        shiroFilterFactoryBean.setSecurityManager(defaultSecurityManager);
        //配置系统受限资源
        HashMap<String, String> map = new HashMap<>();
        map.put("/index.jsp","authc");//authc代表请求这个资源需要认证和授权
        shiroFilterFactoryBean.setLoginUrl("/login.jsp");//设置默认认证路径
        shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
        //配置系统公共资源
        return shiroFilterFactoryBean;
    }
    //2.创建安全管理器
    @Bean
    public DefaultWebSecurityManager getDefaultWebSecurityManager( Realm realm){
        DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
        //给安全管理器设置realm
        defaultWebSecurityManager.setRealm(realm);
        return defaultWebSecurityManager;
    }
    //3.创建自定义realm
   @Bean
    public Realm getRealm(){
        BaseRealm baseRealm = new BaseRealm();
        return baseRealm;
   }
}
复制代码


一开始我还觉得这个错误应该是idea编译器的问题,面向百度编程,百度了一下,在网上有这个问题的小伙伴少之又少,于是我开始自己动手解决,解决办法也很简单,我需要注入的是下面getRealm类,于是我在爆红的地方加了一个注解***@Qualifier("getRealm")***,于是乎完美运行


package com.config;
import com.shiro.BaseRealm;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import java.util.HashMap;
//用来整合sshiro相关的类
@Configuration
public class ShiroConfigBase {
    //1.创建shiro
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultSecurityManager defaultSecurityManager){
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        //给filter设置安全管理器,负责拦截所有请求
        shiroFilterFactoryBean.setSecurityManager(defaultSecurityManager);
        //配置系统受限资源
        HashMap<String, String> map = new HashMap<>();
        map.put("/index.jsp","authc");//authc代表请求这个资源需要认证和授权
        shiroFilterFactoryBean.setLoginUrl("/login.jsp");//设置默认认证路径
        shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
        //配置系统公共资源
        return shiroFilterFactoryBean;
    }
    //2.创建安全管理器
    @Bean
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("getRealm") Realm realm){
        DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
        //给安全管理器设置realm
        defaultWebSecurityManager.setRealm(realm);
        return defaultWebSecurityManager;
    }
    //3.创建自定义realm
   @Bean
    public Realm getRealm(){
        BaseRealm baseRealm = new BaseRealm();
        return baseRealm;
   }
}
复制代码

3.JPG


相关文章
|
1月前
|
XML Java 开发者
Spring Boot中的bean注入方式和原理
Spring Boot中的bean注入方式和原理
247 0
|
22天前
|
Java Spring
解决Springboot集成ElasticSearch 报错:A bean with that name has already been defined in null and overriding
解决Springboot集成ElasticSearch 报错:A bean with that name has already been defined in null and overriding
|
22天前
|
Java 数据库
SpringBoot整合es7.x启动报错:Rejecting mapping update to [AAA] as the final mapping would have more than 1
SpringBoot整合es7.x启动报错:Rejecting mapping update to [AAA] as the final mapping would have more than 1
|
2天前
|
Java Linux 程序员
技术笔记:Spring生态研习【五】:Springboot中bean的条件注入
技术笔记:Spring生态研习【五】:Springboot中bean的条件注入
|
4天前
|
Java
手写SpringBoot(四)之bean动态加载
可以看到只有userApplication tomcatWebServer init打印,没有mySpringboot tomcatWebServer init打印,证明spring-boot只加载了用户定义的那个tomcatWebServer
7 0
|
8天前
|
Java
springboot Test 测试类中如何排除一个bean类
springboot Test 测试类中如何排除一个bean类
8 0
|
8天前
|
NoSQL 安全 Linux
springboot+shiro+redis前后端分离实现认证(一)
springboot+shiro+redis前后端分离实现认证(一)
10 0
|
9天前
|
JavaScript 前端开发 NoSQL
杨校老师项目之基于SpringBoot+Shiro+Vue的企业人事管理系统
杨校老师项目之基于SpringBoot+Shiro+Vue的企业人事管理系统
15 0
|
9天前
|
安全 Java 数据安全/隐私保护
上手spring boot项目(二)之spring boot整合shiro安全框架
上手spring boot项目(二)之spring boot整合shiro安全框架
|
10天前
|
开发框架 安全 Java
信息打点-语言框架&开发组件&FastJson&Shiro&Log4j&SpringBoot等
信息打点-语言框架&开发组件&FastJson&Shiro&Log4j&SpringBoot等