SpringBoot+Shiro常见问题处理

  1. 在使用shiro时,ShiroFilterFactoryBean 会依赖注入 securityManager 然后 securityManager 会注入自定义 Realm ,然后自定义Realm类里面会注入业务的service类,而那些service类包含事务,都是动态代理类。因此无法注入,大致异常为:xxxx is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)。
  2. 由于shiro的bean先于Spring事务将userService实例化了,结果导致spring事务初始化时好无法扫描到该bean,导致这个bean上没有绑定事务,导致事务无效,报错如下:
    在这里插入图片描述

一,xxxx is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)解决

1.在字段上加@Lazy(推荐)

import org.springframework.context.annotation.Lazy;
import org.apache.shiro.realm.AuthorizingRealm;
 
public class DatabaseRealm extends AuthorizingRealm {
    @Lazy
    @Autowired
    private UserService userService;

2.加到构造方法的参数上


import org.springframework.context.annotation.Lazy;
import org.apache.shiro.realm.AuthorizingRealm;
 
public class DatabaseRealm extends AuthorizingRealm {
    private UserService userService;
	public DatabaseRealm(@Lazy @Autowired UserService userService){
		this.userService = userService;
	}
}

3.使用hutool工具类下的SpringUtil

  @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        UsernamePasswordToken userToken = (UsernamePasswordToken) authenticationToken;
        MUserService userService = SpringUtil.getBean(MUserService.class);
        //查询
        MUser user = userService.getOneUser(userToken.getUsername());
        if(user == null){
            throw new UnknownAccountException("账户不存在");
        }
        if(!String.valueOf(userToken.getPassword()).equals(user.getPassword())){
            throw new IncorrectCredentialsException("密码错误");
        }
        return new SimpleAuthenticationInfo(user,user.getPassword(),getName());
    }

4.在Shiro框架中注入Bean时,不使用@Autowire,使用ApplicationContextRegister.getBean()方法,手动注入bean。保证该方法只有在程序完全启动运行时,才被注入

二,事务失效解决方法

1.在字段上加@Lazy(推荐)

import org.springframework.context.annotation.Lazy;
import org.apache.shiro.realm.AuthorizingRealm;
 
public class DatabaseRealm extends AuthorizingRealm {
    @Lazy
    @Autowired
    private UserService userService;

2.orm映射框架的Mapper类,不是由Spring生成初始化,只是交给Spring管理,不会影响Spring bean的初始化

public class UserRealm extends AuthorizingRealm {
    private static final Logger LOGGER = LoggerFactory.getLogger(UserRealm.class);
    @Autowired
    private SysUserMapper sysUserMapper;
    
    @Autowired
    private SysPermissionMapper sysPermissionMapper;

    //省略其他代码
}

3.在service实现层的类或者public方法上添加@Transactionl注解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一位不知名民工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值