在 Spring Boot 中集成 Shiro,并使用 JWT 進(jìn)行接口認(rèn)證。
為了統(tǒng)一對 Token 進(jìn)行過濾,所以自定義了一個 JwtTokenFilter 過濾器。
期間遇到了以下幾個問題,這里逐一進(jìn)行記錄,以備日后查閱。
問題一:JwtTokenFilter 無法使用 @Autowired
因為自定義了一個 JWT Token 工具類,用來解析和創(chuàng)建 Token,JwtTokenFilter 中需要用到此工具類,這里本來可以直接手動進(jìn)行 new 一個新的實例,但由于在 Spring 配置文件中定義了 JWT 簽名密鑰和過期時間,所以想使用 Spring @ConfigurationProperties 注解進(jìn)行值得注入,所以這里必須不能手動 new 一個新的實例。
所以在 ShiroConfiguration 配置文件中將 JwtTokenFilter 過濾器交由 Spring 管理:
2 | public JwtTokenFilter JwtTokenFilter() { |
3 | return new JwtTokenFilter(); |
啟動項目進(jìn)行測試,JwtTokenFilter 過濾器中 JwtUtil 類成功注入,但又遇到了另外一個問題。
問題二:anon 過濾器失效
在問題一解決后,登錄接口一直顯示需要認(rèn)證,所以在只能將 ShiroFilterFactoryBean
中定義的 JwtTokenFilter
又改為原先手動 new:
01 | @Bean (name = "shiroFilter" ) |
02 | public ShiroFilterFactoryBean shiroFilterFactoryBean() { |
03 | ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); |
04 | shiroFilterFactoryBean.setSecurityManager(securityManager()); |
06 | Map<String, Filter> filterMap = new LinkedHashMap<>( 8 ); |
08 | filterMap.put( "authc" , new JwtTokenFilter()); |
09 | shiroFilterFactoryBean.setFilters(filterMap); |
10 | Map<String, String> filterChains = new LinkedHashMap<>( 8 ); |
11 | filterChains.put( "/v1/admin/login" , "anon" ); |
12 | filterChains.put( "/**" , "authc" ); |
13 | shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChains); |
14 | return shiroFilterFactoryBean; |
接著創(chuàng)建一個 Spring 的上下文管理工具類,代碼如下:
01 | package com.nwgdk.ums.common.util; |
02 | import org.springframework.beans.BeansException; |
03 | import org.springframework.context.ApplicationContext; |
04 | import org.springframework.context.ApplicationContextAware; |
05 | import org.springframework.stereotype.Component; |
12 | public class SpringContextUtil implements ApplicationContextAware { |
13 | private static ApplicationContext applicationContext; |
15 | public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { |
16 | SpringContextUtil.applicationContext = applicationContext; |
21 | public static ApplicationContext getApplicationContext() { |
22 | return applicationContext; |
25 | * 通過 bena 名稱獲取上下文中的 bean |
27 | public static Object getBean(String name) { |
28 | return applicationContext.getBean(name); |
33 | public static Object getBean(Class<?> requiredType) { |
34 | return applicationContext.getBean(requiredType); |
接著,在 JwtTokenFilter 過濾器中通過以上工具類獲取 JwtUtil 工具類:
1 | if (StringUtils.isNotEmpty(jwtToken)) { |
3 | jwtUtil = (JwtUtil) SpringContextUtil.getBean( "jwtUtil" ); |
啟動項目進(jìn)行測試,成功登錄。
總結(jié)
以上所述是小編給大家介紹的Spring Boot 自定義 Shiro 過濾器無法使用 @Autowired問題及解決方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對服務(wù)器之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!