Commit 93686c7b60ae896ce7235532a111ac7539f2346f

Authored by gaibu
1 parent ee454ace

fix: 积木报表 API 数据集解析时 token 未正确解析的问题

yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/jmreport/config/JmReportConfiguration.java
1 1 package cn.iocoder.yudao.module.visualization.framework.jmreport.config;
2 2  
3   -import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum;
4 3 import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi;
5 4 import cn.iocoder.yudao.module.visualization.framework.jmreport.core.service.JmReportTokenServiceImpl;
6   -import cn.iocoder.yudao.module.visualization.framework.jmreport.core.web.JmReportTokenFilter;
7 5 import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
8   -import org.springframework.boot.web.servlet.FilterRegistrationBean;
9 6 import org.springframework.context.annotation.Bean;
10 7 import org.springframework.context.annotation.ComponentScan;
11 8 import org.springframework.context.annotation.Configuration;
... ... @@ -25,12 +22,4 @@ public class JmReportConfiguration {
25 22 return new JmReportTokenServiceImpl(oAuth2TokenApi);
26 23 }
27 24  
28   - @Bean
29   - @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
30   - public FilterRegistrationBean<JmReportTokenFilter> registerMyAnotherFilter(OAuth2TokenApi oAuth2TokenApi){
31   - FilterRegistrationBean<JmReportTokenFilter> bean = new FilterRegistrationBean<>();
32   - bean.setOrder(WebFilterOrderEnum.JM_TOKEN_FILTER);
33   - bean.setFilter(new JmReportTokenFilter(oAuth2TokenApi));
34   - return bean;
35   - }
36 25 }
... ...
yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/jmreport/core/service/JmReportTokenServiceImpl.java
... ... @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.visualization.framework.jmreport.core.service;
2 2  
3 3 import cn.hutool.core.util.StrUtil;
4 4 import cn.iocoder.yudao.framework.common.exception.ServiceException;
  5 +import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
5 6 import cn.iocoder.yudao.framework.security.core.LoginUser;
6 7 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
7 8 import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
... ... @@ -10,6 +11,9 @@ import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi;
10 11 import cn.iocoder.yudao.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO;
11 12 import lombok.RequiredArgsConstructor;
12 13 import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
  14 +import org.springframework.http.HttpHeaders;
  15 +
  16 +import javax.servlet.http.HttpServletRequest;
13 17  
14 18 /**
15 19 * {@link JmReportTokenServiceI} 实现类,提供积木报表的 Token 校验、用户信息的查询等功能
... ... @@ -18,10 +22,34 @@ import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
18 22 */
19 23 @RequiredArgsConstructor
20 24 public class JmReportTokenServiceImpl implements JmReportTokenServiceI {
  25 + private static final String JM_TOKEN_HEADER = "X-Access-Token";
  26 + /**
  27 + * 系统内置请求头
  28 + */
  29 + private static final String TOKEN_HEADER = "Authorization";
  30 + /**
  31 + * auth 相关格式
  32 + */
  33 + private static final String AUTHORIZATION_FORMAT = "Bearer %s";
21 34  
22 35 private final OAuth2TokenApi oauth2TokenApi;
23 36  
24 37 /**
  38 + * 修改请求的 head
  39 + *
  40 + * @return 新 head
  41 + */
  42 + @Override
  43 + public HttpHeaders customApiHeader() {
  44 + HttpHeaders header = new HttpHeaders();
  45 + HttpServletRequest request = ServletUtils.getRequest();
  46 + String token = request.getHeader(JM_TOKEN_HEADER);
  47 +
  48 + header.add(TOKEN_HEADER, String.format(AUTHORIZATION_FORMAT, token));
  49 + return header;
  50 + }
  51 +
  52 + /**
25 53 * 校验 Token 是否有效,即验证通过
26 54 *
27 55 * @param token JmReport 前端传递的 token
... ... @@ -62,7 +90,7 @@ public class JmReportTokenServiceImpl implements JmReportTokenServiceI {
62 90  
63 91 /**
64 92 * 获得用户编号
65   - *
  93 + * <p>
66 94 * 虽然方法名获得的是 username,实际对应到项目中是用户编号
67 95 *
68 96 * @param token JmReport 前端传递的 token
... ...
yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/jmreport/core/web/JmReportTokenFilter.java deleted
1   -package cn.iocoder.yudao.module.visualization.framework.jmreport.core.web;
2   -
3   -import cn.hutool.core.util.StrUtil;
4   -import cn.iocoder.yudao.framework.security.core.LoginUser;
5   -import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
6   -import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi;
7   -import cn.iocoder.yudao.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO;
8   -import lombok.RequiredArgsConstructor;
9   -
10   -import javax.servlet.Filter;
11   -import javax.servlet.FilterChain;
12   -import javax.servlet.ServletException;
13   -import javax.servlet.ServletRequest;
14   -import javax.servlet.ServletResponse;
15   -import javax.servlet.http.HttpServletRequest;
16   -import javax.servlet.http.HttpServletRequestWrapper;
17   -import java.io.IOException;
18   -import java.util.Collections;
19   -import java.util.Enumeration;
20   -import java.util.HashMap;
21   -import java.util.List;
22   -import java.util.Map;
23   -import java.util.Optional;
24   -
25   -/**
26   - * 积木报表 token 处理,将积木报表请求头中的 token 转换成 spring security 的 auth head
27   - */
28   -@RequiredArgsConstructor
29   -public class JmReportTokenFilter implements Filter {
30   - /**
31   - * 积木 token 请求头
32   - */
33   - private static final String JM_TOKEN_HEADER = "X-Access-Token";
34   - /**
35   - * 系统内置请求头
36   - */
37   - private static final String TOKEN_HEADER = "Authorization";
38   - /**
39   - * auth 相关格式
40   - */
41   - private static final String AUTHORIZATION_FORMAT = "Bearer %s";
42   -
43   - private final OAuth2TokenApi oauth2TokenApi;
44   -
45   - @Override
46   - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
47   - // 积木请求头
48   - HttpServletRequest req = (HttpServletRequest) servletRequest;
49   - String token = req.getHeader(JM_TOKEN_HEADER);
50   - if (StrUtil.isNotEmpty(token)) {
51   - // 1. 增加请求头
52   - HeaderMapRequestWrapper requestWrapper = new HeaderMapRequestWrapper(req);
53   - requestWrapper.addHeader(TOKEN_HEADER, String.format(AUTHORIZATION_FORMAT, token));
54   -
55   - OAuth2AccessTokenCheckRespDTO resp = oauth2TokenApi.checkAccessToken(token);
56   - Optional<LoginUser> optUser = Optional.ofNullable(resp)
57   - .map(
58   - t -> new LoginUser().setId(t.getUserId())
59   - .setUserType(t.getUserType())
60   - .setTenantId(t.getTenantId())
61   - .setScopes(t.getScopes())
62   - );
63   - if (optUser.isPresent()) {
64   - // 2. 设置登录用户类型
65   - WebFrameworkUtils.setLoginUserType(servletRequest, optUser.get().getUserType());
66   - filterChain.doFilter(requestWrapper, servletResponse);
67   - return;
68   - }
69   - }
70   - filterChain.doFilter(servletRequest, servletResponse);
71   - }
72   -
73   - /**
74   - * request 包装类,用于修改 head
75   - *
76   - * <a href="https://stackoverflow.com/questions/2811769/adding-an-http-header-to-the-request-in-a-servlet-filter">add request head</a>
77   - */
78   - public class HeaderMapRequestWrapper extends HttpServletRequestWrapper {
79   - /**
80   - * construct a wrapper for this request
81   - *
82   - * @param request
83   - */
84   - public HeaderMapRequestWrapper(HttpServletRequest request) {
85   - super(request);
86   - }
87   -
88   - private Map<String, String> headerMap = new HashMap<String, String>();
89   -
90   - /**
91   - * add a header with given name and value
92   - *
93   - * @param name
94   - * @param value
95   - */
96   - public void addHeader(String name, String value) {
97   - headerMap.put(name, value);
98   - }
99   -
100   - @Override
101   - public String getHeader(String name) {
102   - String headerValue = super.getHeader(name);
103   - if (headerMap.containsKey(name)) {
104   - headerValue = headerMap.get(name);
105   - }
106   - return headerValue;
107   - }
108   -
109   - /**
110   - * get the Header names
111   - */
112   - @Override
113   - public Enumeration<String> getHeaderNames() {
114   - List<String> names = Collections.list(super.getHeaderNames());
115   - for (String name : headerMap.keySet()) {
116   - names.add(name);
117   - }
118   - return Collections.enumeration(names);
119   - }
120   -
121   - @Override
122   - public Enumeration<String> getHeaders(String name) {
123   - List<String> values = Collections.list(super.getHeaders(name));
124   - if (headerMap.containsKey(name)) {
125   - values.add(headerMap.get(name));
126   - }
127   - return Collections.enumeration(values);
128   - }
129   -
130   - }
131   -
132   -}