Spring Boot 自定義 Shiro 過濾器無法使用 @Autowired問題及解決方法
在 Spring Boot 中集成 Shiro,并使用 JWT 進行接口認證。
為了統(tǒng)一對 Token 進行過濾,所以自定義了一個 JwtTokenFilter 過濾器。
期間遇到了以下幾個問題,這里逐一進行記錄,以備日后查閱。
問題一:JwtTokenFilter 無法使用 @Autowired
因為自定義了一個 JWT Token 工具類,用來解析和創(chuàng)建 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<String, Filter> filterMap = new LinkedHashMap<>(8);
// 這里只能使用 new 新建實例
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)建一個 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");
}
}
啟動項目進行測試,成功登錄。
總結(jié)
以上所述是小編給大家介紹的Spring Boot 自定義 Shiro 過濾器無法使用 @Autowired問題及解決方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
深入了解SpringBoot中@InitBinder注解的使用
這篇文章主要介紹了深入了解SpringBoot中@InitBinder注解的使用,@InitBinder注解可以作用在被@Controller注解的類的方法上,表示為當(dāng)前控制器注冊一個屬性編輯器,用于對WebDataBinder進行初始化,且只對當(dāng)前的Controller有效,需要的朋友可以參考下2023-10-10
Java批量轉(zhuǎn)換文件編碼格式的實現(xiàn)方法及實例代碼
這篇文章主要介紹了Java實現(xiàn) 批量轉(zhuǎn)換文件編碼格式的方法及實例代碼,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-04-04
解決feignclient調(diào)用服務(wù),傳遞的中文數(shù)據(jù)成???問題
這篇文章主要介紹了解決feignclient調(diào)用服務(wù),傳遞的中文數(shù)據(jù)成???問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
微信小程序與AspNetCore SignalR聊天實例代碼
這篇文章主要介紹了微信小程序與AspNetCore SignalR聊天實例代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-08-08
Java Clone深拷貝與淺拷貝的兩種實現(xiàn)方法
今天小編就為大家分享一篇關(guān)于Java Clone深拷貝與淺拷貝的兩種實現(xiàn)方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10

