栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring Boot 自定义 Shiro 过滤器无法使用 @Autowired问题及解决方法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring Boot 自定义 Shiro 过滤器无法使用 @Autowired问题及解决方法

在 Spring Boot 中集成 Shiro,并使用 JWT 进行接口认证。

为了统一对 Token 进行过滤,所以自定义了一个 JwtTokenFilter 过滤器。

期间遇到了以下几个问题,这里逐一进行记录,以备日后查阅。

问题一:JwtTokenFilter 无法使用 @Autowired

因为自定义了一个 JWT Token 工具类,用来解析和创建 Token,JwtTokenFilter 中需要用到此工具类,这里本来可以直接手动进行 new 一个新的实例,但由于在 Spring 配置文件中定义了 JWT 签名密钥和过期时间,所以想使用 Spring @ConfigurationProperties 注解进行值得注入,所以这里必须不能手动 new 一个新的实例。

所以在 ShiroConfiguration 配置文件中将 JwtTokenFilter 过滤器交由 Spring 管理:

@Bean
public JwtTokenFilter JwtTokenFilter() {
  return new JwtTokenFilter();
}

启动项目进行测试,JwtTokenFilter 过滤器中 JwtUtil 类成功注入,但又遇到了另外一个问题。

问题二:anon 过滤器失效

在问题一解决后,登录接口一直显示需要认证,所以在只能将 ShiroFilterFactoryBean 中定义的 JwtTokenFilter 又改为原先手动 new:

@Bean(name = "shiroFilter")
public ShiroFilterFactoryBean shiroFilterFactoryBean() {
  ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
  shiroFilterFactoryBean.setSecurityManager(securityManager());
  // 注册自定义过滤器
  Map filterMap = new linkedHashMap<>(8);
  // 这里只能使用 new 新建实例
  filterMap.put("authc", new JwtTokenFilter());
  shiroFilterFactoryBean.setFilters(filterMap);
  Map filterChains = new linkedHashMap<>(8);
  filterChains.put("/v1/admin/login", "anon");
  filterChains.put("
@Component
public class SpringContextUtil implements ApplicationContextAware {
  private static ApplicationContext applicationContext;
  @Override
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    SpringContextUtil.applicationContext = applicationContext;
  }
  
  public static ApplicationContext getApplicationContext() {
    return applicationContext;
  }
  
  public static Object getBean(String name) {
    return applicationContext.getBean(name);
  }
  
  public static Object getBean(Class requiredType) {
    return applicationContext.getBean(requiredType);
  }
}

接着,在 JwtTokenFilter 过滤器中通过以上工具类获取 JwtUtil 工具类:

if (StringUtils.isNotEmpty(jwtToken)) {
  if (jwtUtil == null) {
    jwtUtil = (JwtUtil) SpringContextUtil.getBean("jwtUtil");
  }
}

启动项目进行测试,成功登录。

总结

以上所述是小编给大家介绍的Spring Boot 自定义 Shiro 过滤器无法使用 @Autowired问题及解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对考高分网网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/137791.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号