springboot 整合shiro,Realm类中@Autowired失效无法注入bean

最近一直在码代码没怎么测试,今天一登录竟然发现登录都报错了。

报错代码CustomRealm.java 中的如下代码

  Optional<Users> usersOptional = usersRepository.findByUserName(userName);
        if(!usersOptional.isPresent()){
            throw new AccountException("用户名不正确!");
        }

报空指针,这代码能报空指针,心里一凉不会是bean都没注入进去吧,最近一直在写业务代码,@Autowired注解一直在使用不可能出什么问题,但是Realm类中出了问题第一想法肯定和shiro有关,可能是加载shiro的时候Realm这个类还没加载到。

嗯那我就手动让他在使用前加载进来就好了,实现ApplicationContextAware 重写setApplicationContext方法。

@Slf4j
@Component
public class ShiroConfig implements ApplicationContextAware {
    
    @Bean
    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager){

        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        shiroFilterFactoryBean.setLoginUrl("/notLogin");//不配置的话,默认会写web下的login.jsp 或 /login

        shiroFilterFactoryBean.setUnauthorizedUrl("/notRole");
        Map<String,String> filterChainDefinitionMap = new LinkedHashMap<>();
        filterChainDefinitionMap.put("/guest/**", "anon");//游客开放权限
        filterChainDefinitionMap.put("/user/**","roles[user]" );//用户需要user权限
        filterChainDefinitionMap.put("/admin/**","roles[admin]" );//管理员需要  admin权限
        //不用登录的接口
        filterChainDefinitionMap.put("/register", "anon");//注册页面
        filterChainDefinitionMap.put("/login", "anon");//登录页面
        filterChainDefinitionMap.put("/sendMobileCode", "anon");//获取手机验证码
        filterChainDefinitionMap.put("/getVerifyCode", "anon");//获取登录验证码
        filterChainDefinitionMap.put("/index", "anon");//测试使用
        filterChainDefinitionMap.put("/sina/notify", "anon");//异步回调

        filterChainDefinitionMap.put("/bandingCard", "anon");//异步回调
        filterChainDefinitionMap.put("/**", "authc");//该设置放最后,否则所有url都将被拦截

        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        log.info("Shiro拦截器工厂类注入:{}", "成功");

        return shiroFilterFactoryBean;
    }

    @Bean
    public  SecurityManager securityManager(){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(customRealm());
        securityManager.setRememberMeManager(rememberMeManager());
        return securityManager;
    }

    @Bean
    public CustomRealm customRealm(){
        return new CustomRealm();
    }

    /**
     * Cookie 对象
     * @return
     */
    public SimpleCookie rememMeCookie(){
        //初始化设置cookie的名称
        SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
        simpleCookie.setMaxAge(2592000);//设置cookie的生效时间
        return simpleCookie;
    }

    /**
     * cookie 管理对象,记住我功能
     * @return
     */
    public CookieRememberMeManager rememberMeManager(){
        CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
        cookieRememberMeManager.setCookie(rememMeCookie());
        //remeberMe cookie 加密的密钥 各个项目不一样 默认AES算法 密钥长度(128 256 512)
        cookieRememberMeManager.setCipherKey(Base64.getDecoder().decode(Constants.DECODER_STR));
        return cookieRememberMeManager;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        Realm userRealm = (Realm) applicationContext.getBean(CustomRealm.class);
        DefaultWebSecurityManager defaultWebSecurityManager = (DefaultWebSecurityManager) applicationContext.getBean(SecurityManager.class);
        defaultWebSecurityManager.setRealm(userRealm);
    }
}

上面的代码重点下面这一段,加载进来后果然再跑代码就没毛病了。

@Slf4j
@Component
public class ShiroConfig implements ApplicationContextAware {

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        Realm userRealm = (Realm) applicationContext.getBean(CustomRealm.class);
        DefaultWebSecurityManager defaultWebSecurityManager = (DefaultWebSecurityManager) applicationContext.getBean(SecurityManager.class);
        defaultWebSecurityManager.setRealm(userRealm);
    }
}

不知道是不是记忆出了差错,感觉刚整合shiro的时候好像没有这个问题的,又想不起最近写的代码有哪里会影响这一块的代码(˘•ω•˘)

猜你喜欢

转载自blog.csdn.net/sinat_36265222/article/details/86155651