Spring Boot 自定義 Shiro 過(guò)濾器無(wú)法使用 @Autowired問(wèn)題及解決方法
在 Spring Boot 中集成 Shiro,并使用 JWT 進(jìn)行接口認(rèn)證。
為了統(tǒng)一對(duì) Token 進(jìn)行過(guò)濾,所以自定義了一個(gè) JwtTokenFilter 過(guò)濾器。
期間遇到了以下幾個(gè)問(wèn)題,這里逐一進(jìn)行記錄,以備日后查閱。
問(wèn)題一:JwtTokenFilter 無(wú)法使用 @Autowired
因?yàn)樽远x了一個(gè) JWT Token 工具類,用來(lái)解析和創(chuàng)建 Token,JwtTokenFilter 中需要用到此工具類,這里本來(lái)可以直接手動(dòng)進(jìn)行 new 一個(gè)新的實(shí)例,但由于在 Spring 配置文件中定義了 JWT 簽名密鑰和過(guò)期時(shí)間,所以想使用 Spring @ConfigurationProperties 注解進(jìn)行值得注入,所以這里必須不能手動(dòng) new 一個(gè)新的實(shí)例。
所以在 ShiroConfiguration 配置文件中將 JwtTokenFilter 過(guò)濾器交由 Spring 管理:
@Bean public JwtTokenFilter JwtTokenFilter() { return new JwtTokenFilter(); }
啟動(dòng)項(xiàng)目進(jìn)行測(cè)試,JwtTokenFilter 過(guò)濾器中 JwtUtil 類成功注入,但又遇到了另外一個(gè)問(wèn)題。
問(wèn)題二:anon 過(guò)濾器失效
在問(wèn)題一解決后,登錄接口一直顯示需要認(rèn)證,所以在只能將 ShiroFilterFactoryBean
中定義的 JwtTokenFilter
又改為原先手動(dòng) new:
@Bean(name = "shiroFilter") public ShiroFilterFactoryBean shiroFilterFactoryBean() { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager()); // 注冊(cè)自定義過(guò)濾器 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; } /** * 通過(guò) bena 名稱獲取上下文中的 bean */ public static Object getBean(String name) { return applicationContext.getBean(name); } /** * 通過(guò)類型獲取上下文中的bean */ public static Object getBean(Class<?> requiredType) { return applicationContext.getBean(requiredType); } }
接著,在 JwtTokenFilter 過(guò)濾器中通過(guò)以上工具類獲取 JwtUtil 工具類:
if (StringUtils.isNotEmpty(jwtToken)) { if (jwtUtil == null) { jwtUtil = (JwtUtil) SpringContextUtil.getBean("jwtUtil"); } }
啟動(dòng)項(xiàng)目進(jìn)行測(cè)試,成功登錄。
總結(jié)
以上所述是小編給大家介紹的Spring Boot 自定義 Shiro 過(guò)濾器無(wú)法使用 @Autowired問(wèn)題及解決方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
深入了解SpringBoot中@InitBinder注解的使用
這篇文章主要介紹了深入了解SpringBoot中@InitBinder注解的使用,@InitBinder注解可以作用在被@Controller注解的類的方法上,表示為當(dāng)前控制器注冊(cè)一個(gè)屬性編輯器,用于對(duì)WebDataBinder進(jìn)行初始化,且只對(duì)當(dāng)前的Controller有效,需要的朋友可以參考下2023-10-10Java批量轉(zhuǎn)換文件編碼格式的實(shí)現(xiàn)方法及實(shí)例代碼
這篇文章主要介紹了Java實(shí)現(xiàn) 批量轉(zhuǎn)換文件編碼格式的方法及實(shí)例代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04解決feignclient調(diào)用服務(wù),傳遞的中文數(shù)據(jù)成???問(wèn)題
這篇文章主要介紹了解決feignclient調(diào)用服務(wù),傳遞的中文數(shù)據(jù)成???問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01java 二維數(shù)組矩陣乘法的實(shí)現(xiàn)方法
java 二維數(shù)組矩陣乘法的實(shí)現(xiàn)方法,需要的朋友可以參考一下2013-03-03微信小程序與AspNetCore SignalR聊天實(shí)例代碼
這篇文章主要介紹了微信小程序與AspNetCore SignalR聊天實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08Java Clone深拷貝與淺拷貝的兩種實(shí)現(xiàn)方法
今天小編就為大家分享一篇關(guān)于Java Clone深拷貝與淺拷貝的兩種實(shí)現(xiàn)方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10java 線程之對(duì)象的同步和異步(實(shí)例講解)
下面小編就為大家?guī)?lái)一篇java 線程之對(duì)象的同步和異步(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07maven工程打包引入本地jar包的實(shí)現(xiàn)
我們需要將jar包發(fā)布到一些指定的第三方Maven倉(cāng)庫(kù),本文主要介紹了maven工程打包引入本地jar包的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02