溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring Boot自定義Shiro過濾器無法使用@Autowired怎么辦

發(fā)布時(shí)間:2021-07-14 11:03:58 來源:億速云 閱讀:107 作者:小新 欄目:編程語言

這篇文章主要介紹了Spring Boot自定義Shiro過濾器無法使用@Autowired怎么辦,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

問題一:JwtTokenFilter 無法使用 @Autowired

因?yàn)樽远x了一個(gè) JWT Token 工具類,用來解析和創(chuàng)建 Token,JwtTokenFilter 中需要用到此工具類,這里本來可以直接手動(dòng)進(jìn)行 new 一個(gè)新的實(shí)例,但由于在 Spring 配置文件中定義了 JWT 簽名密鑰和過期時(shí)間,所以想使用 Spring @ConfigurationProperties 注解進(jìn)行值得注入,所以這里必須不能手動(dòng) new 一個(gè)新的實(shí)例。

所以在 ShiroConfiguration 配置文件中將 JwtTokenFilter 過濾器交由 Spring 管理:

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

啟動(dòng)項(xiàng)目進(jìn)行測(cè)試,JwtTokenFilter 過濾器中 JwtUtil 類成功注入,但又遇到了另外一個(gè)問題。

問題二:anon 過濾器失效

在問題一解決后,登錄接口一直顯示需要認(rèn)證,所以在只能將 ShiroFilterFactoryBean 中定義的 JwtTokenFilter 又改為原先手動(dòng) new:

@Bean(name = "shiroFilter")
public ShiroFilterFactoryBean shiroFilterFactoryBean() {
  ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
  shiroFilterFactoryBean.setSecurityManager(securityManager());
  // 注冊(cè)自定義過濾器
  Map<String, Filter> filterMap = new LinkedHashMap<>(8);
  // 這里只能使用 new 新建實(shí)例
  filterMap.put("authc", new JwtTokenFilter());
  shiroFilterFactoryBean.setFilters(filterMap);
  Map<String, String> filterChains = new LinkedHashMap<>(8);
  filterChains.put("/v1/admin/login", "anon");
  filterChains.put("/**", "authc");
  shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChains);
  return shiroFilterFactoryBean;
}

接著創(chuàng)建一個(gè) Spring 的上下文管理工具類,代碼如下:

package com.nwgdk.ums.common.util;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
 * Spring 上下文工具類
 *
 * @author nwgdk
 */
@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;
  }
  /**
   * 通過 bena 名稱獲取上下文中的 bean
   */
  public static Object getBean(String name) {
    return applicationContext.getBean(name);
  }
  /**
   * 通過類型獲取上下文中的bean
   */
  public static Object getBean(Class<?> requiredType) {
    return applicationContext.getBean(requiredType);
  }
}

接著,在 JwtTokenFilter 過濾器中通過以上工具類獲取 JwtUtil 工具類:

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

啟動(dòng)項(xiàng)目進(jìn)行測(cè)試,成功登錄。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Spring Boot自定義Shiro過濾器無法使用@Autowired怎么辦”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI