最新消息: 新版網站上線了?。?!
  • Spring Boot 自定義 Shiro 過濾器無法使用 @Autowired問題及解決方法

    Spring Boot 中集成 Shiro,并使用 JWT 進行接口認證。

    為了統一對 Token 進行過濾,所以自定義了一個 JwtTokenFilter 過濾器。

    期間遇到了以下幾個問題,這里逐一進行記錄,以備日后查閱。

    問題一:JwtTokenFilter 無法使用 @Autowired

    因為自定義了一個 JWT Token 工具類,用來解析和創建 Token,JwtTokenFilter 中需要用到此工具類,這里本來可以直接手動進行 new 一個新的實例,但由于在 Spring 配置文件中定義了 JWT 簽名密鑰和過期時間,所以想使用 Spring @ConfigurationProperties 注解進行值得注入,所以這里必須不能手動 new 一個新的實例。

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

    @Beanpublic 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;
    }

    接著創建一個 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");
        }
    }

    啟動項目進行測試,成功登錄


    轉載請注明:谷谷點程序 » Spring Boot 自定義 Shiro 過濾器無法使用 @Autowired問題及解決方法

    平度胜利路按摩在什么地方多,平度做大活的足疗,平度职教中心女孩微信,平度找曼地方