springboot shiro Realm 无法自动注入

该博客文章讨论了在Spring Boot应用中遇到的Shiro配置问题,具体表现为 UnsatisfiedDependencyException。错误源于在ShiroConfig类中直接new MyRealm对象而非通过@Bean注解注入。解决方案是确保所有Shiro相关组件都是Spring管理的Bean,并使用@Autowired和@Qualifier注解进行依赖注入。同时,文章提醒读者检查MyRealm类的依赖,如SysRoleService,确保它们的Mapper也被正确扫描和注入。
部署运行你感兴趣的模型镜像

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘rabbitConnectionFactoryMetricsPostProcessor’ defined in class path resource [org/springframework/boot/actuate/autoconfigure/metrics/amqp/RabbitMetricsAutoConfiguration.class]: Unsatisfied dependency expressed through method ‘rabbitConnectionFactoryMetricsPostProcessor’ parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘shiroFilterFactory’ defined in class path resource [com/common/config/ShiroConfig.class]: Unsatisfied dependency expressed through method ‘shiroFilterFactory’ parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘securityManager’ defined in class path resource [com/common/config/ShiroConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.shiro.mgt.SecurityManager]: Factory method ‘securityManager’ threw exception; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘shiroRealm’: Unsatisfied dependency expressed through field ‘sysRoleService’; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘sysRoleServiceImpl’: Unsatisfied dependency expressed through field ‘baseMapper’; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type ‘com.core.dao.SysRoleDao’ available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

解决方法

原因1: 在ShiroConfiguration中要使用@Bean在ApplicationContext注入MyRealm,不能直接new对象。

道理和Controller中调用Service一样,都要是SpringBean,不能自己new。

错误演示:

@Bean(name = "securityManager")
public SecurityManager securityManager() {
    DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
    MyRealm myRealm = new MyRealm();
    manager.setRealm(myRealm);
    return manager;
  }

正确操作:

@Bean(name = "myRealm")
public MyRealm myAuthRealm() {
    MyRealm myRealm = new MyRealm();
    return myRealm;
  }
@Bean(name = "securityManager")
public SecurityManager securityManager(@Qualifier("myRealm")MyRealm myRealm) {
    DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
    manager.setRealm(myRealm);
    return manager;
  }

原因2:Application添加注释@MapperScan(“com.**.mapper”) //mybatis扫描Mapper所在包

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

虽然给定引用中未直接提及Spring Boot集成Shiro实现免密登录的具体方法,但可基于Shiro的特性和一般开发思路来构建解决方案。 ### 核心思路 Shiro的多Realm机制可用于实现免密登录。可以创建一个专门用于免密登录的Realm,在这个Realm中不进行密码验证。 ### 具体步骤 #### 1. 配置Shiro 可参考引用[4]中的配置示例,同时添加必要的配置项。 ```yaml shiro: # AES密码加密私钥(Base64加密) encryptAesKey: V2FuZzkyNjQ1NGRTQkFQSUpXVA== # JWT认证加密私钥(Base64加密) encryptJwtKey: U0JBUElKV1RkV2FuZzkyNjQ1NA== # AccessToken过期时间-5分钟-5*60(秒为单位) accessTokenExpireTime: 3600 # RefreshToken过期时间-60分钟-30*60(秒为单位) refreshTokenExpireTime: 86400 # Shiro缓存过期时间-5分钟-5*60(秒为单位)(一般设置与AccessToken过期时间一致) shiroCacheExpireTime: 3600 # 是否需要开启任何请求必须登录才可访问,开发时候可以为false,生产与测试必须为true mustLoginFlag: false #shiro排除过滤url,多个用,分割 excludeUrlList: - "/sys/login" - "/sys/captcha" - "/wx-user/login" customerRealmClassList: - "defaultUserRealm" - "weChatUserRealm" - "passwordlessRealm" # 新增免密登录的Realm ``` #### 2. 创建免密登录的Realm ```java import org.apache.shiro.authc.*; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; public class PasswordlessRealm extends AuthorizingRealm { @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { // 授权逻辑,可根据实际情况实现 return null; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { UsernamePasswordToken upToken = (UsernamePasswordToken) token; String username = upToken.getUsername(); // 这里不进行密码验证,直接认为用户存在 return new SimpleAuthenticationInfo(username, null, getName()); } } ``` #### 3. 注入Realm到SecurityManager ```java import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition; import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class ShiroConfig { @Bean public PasswordlessRealm passwordlessRealm() { return new PasswordlessRealm(); } @Bean public SecurityManager securityManager(PasswordlessRealm passwordlessRealm) { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(passwordlessRealm); return securityManager; } @Bean public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); return shiroFilterFactoryBean; } @Bean public ShiroFilterChainDefinition shiroFilterChainDefinition() { DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition(); chainDefinition.addPathDefinition("/passwordless/login", "anon"); // 免密登录接口 chainDefinition.addPathDefinition("/**", "authc"); return chainDefinition; } } ``` #### 4. 实现免密登录接口 ```java import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.subject.Subject; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class PasswordlessLoginController { @GetMapping("/passwordless/login") public String passwordlessLogin(@RequestParam String username) { Subject currentUser = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(username, ""); // 密码为空 try { currentUser.login(token); return "免密登录成功"; } catch (Exception e) { return "免密登录失败"; } } } ``` ### 总结 通过以上步骤,在Spring Boot项目中集成Shiro实现了免密登录。创建了专门的免密登录Realm,在该Realm中不进行密码验证,同时配置了Shiro的SecurityManager和过滤器链,最后实现了免密登录的接口。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值