您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“SpringBoot自定義Shiro過濾器無法使用@Autowired怎么辦”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“SpringBoot自定義Shiro過濾器無法使用@Autowired怎么辦”這篇文章吧。
在 Spring Boot 中集成 Shiro,并使用 JWT 進(jìn)行接口認(rèn)證。
為了統(tǒng)一對(duì) Token 進(jìn)行過濾,所以自定義了一個(gè) JwtTokenFilter 過濾器。
期間遇到了以下幾個(gè)問題,這里逐一進(jìn)行記錄,以備日后查閱。
問題一: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 管理:
@Beanpublic 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 */@Componentpublic 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è)試,成功登錄。
以上是“SpringBoot自定義Shiro過濾器無法使用@Autowired怎么辦”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。