Skip to content

Commit f330278

Browse files
committed
feat: 添加 feign 拦截器,传递 token、用户信息
1 parent adfebc0 commit f330278

8 files changed

Lines changed: 177 additions & 3 deletions

File tree

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.github.cadecode.uniboot.example.svc.controller;
2+
3+
import com.github.cadecode.uniboot.framework.api.annotation.ApiFormat;
4+
import com.github.cadecode.uniboot.framework.api.feign.ExampleClient;
5+
import io.swagger.annotations.Api;
6+
import io.swagger.annotations.ApiOperation;
7+
import lombok.RequiredArgsConstructor;
8+
import lombok.extern.slf4j.Slf4j;
9+
import org.springframework.web.bind.annotation.PostMapping;
10+
import org.springframework.web.bind.annotation.RequestMapping;
11+
import org.springframework.web.bind.annotation.RequestParam;
12+
import org.springframework.web.bind.annotation.RestController;
13+
14+
/**
15+
* RPC 测试
16+
*
17+
* @author Cade Li
18+
* @since 2023/7/29
19+
*/
20+
@ApiFormat
21+
@Slf4j
22+
@RequiredArgsConstructor
23+
@Api(tags = "RPC 测试")
24+
@RestController
25+
@RequestMapping("rpc_example")
26+
public class RpcExampleController {
27+
28+
private final ExampleClient exampleClient;
29+
30+
@ApiOperation("传递字符串")
31+
@PostMapping("test_str")
32+
public String testStr(@RequestParam String str) {
33+
return exampleClient.testStr(str);
34+
}
35+
36+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.github.cadecode.uniboot.framework.api.config;
2+
3+
import cn.hutool.core.util.CharsetUtil;
4+
import cn.hutool.core.util.EscapeUtil;
5+
import cn.hutool.core.util.ObjectUtil;
6+
import cn.hutool.core.util.StrUtil;
7+
import cn.hutool.extra.servlet.ServletUtil;
8+
import com.github.cadecode.uniboot.common.core.util.JacksonUtil;
9+
import com.github.cadecode.uniboot.framework.api.bean.dto.SysUserDto.SysUserDetailsDto;
10+
import com.github.cadecode.uniboot.framework.api.consts.SecurityConst;
11+
import com.github.cadecode.uniboot.framework.api.util.SecurityUtil;
12+
import feign.RequestInterceptor;
13+
import org.springframework.context.annotation.Bean;
14+
import org.springframework.context.annotation.Configuration;
15+
import org.springframework.web.context.request.RequestContextHolder;
16+
import org.springframework.web.context.request.ServletRequestAttributes;
17+
18+
import javax.servlet.http.HttpServletRequest;
19+
20+
/**
21+
* OpenFeign 配置类
22+
*
23+
* @author Cade Li
24+
* @since 2023/7/29
25+
*/
26+
@Configuration
27+
public class FeignConfig {
28+
29+
@Bean
30+
public RequestInterceptor requestInterceptor() {
31+
return requestTemplate -> {
32+
// 获取请求对象
33+
HttpServletRequest sRequest = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
34+
if (ObjectUtil.isNull(sRequest)) {
35+
return;
36+
}
37+
// 传递用户 token
38+
String token = SecurityUtil.getTokenFromRequest(sRequest);
39+
if (StrUtil.isNotEmpty(token)) {
40+
requestTemplate.header(SecurityUtil.getHeader(), token);
41+
}
42+
// 传递用户详细信息
43+
String userDetailsJson = ServletUtil.getHeader(sRequest, SecurityConst.USER_DETAILS, CharsetUtil.CHARSET_UTF_8);
44+
if (StrUtil.isEmpty(userDetailsJson)) {
45+
SysUserDetailsDto userDetailsDto = SecurityUtil.getUserDetails(null);
46+
userDetailsJson = JacksonUtil.toJson(userDetailsDto);
47+
}
48+
requestTemplate.header(SecurityConst.USER_DETAILS, EscapeUtil.escape(userDetailsJson));
49+
// 配置客户端 IP
50+
requestTemplate.header("X-Forwarded-For", ServletUtil.getClientIP(sRequest));
51+
};
52+
}
53+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.github.cadecode.uniboot.framework.api.consts;
2+
3+
/**
4+
* Security 常量
5+
*
6+
* @author Cade Li
7+
* @since 2023/7/29
8+
*/
9+
public interface SecurityConst {
10+
11+
String USER_DETAILS = "feign-user-details";
12+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.github.cadecode.uniboot.framework.api.feign;
2+
3+
import com.github.cadecode.uniboot.framework.api.consts.SvcName;
4+
import org.springframework.cloud.openfeign.FeignClient;
5+
import org.springframework.web.bind.annotation.PostMapping;
6+
import org.springframework.web.bind.annotation.RequestParam;
7+
8+
/**
9+
* 测试 feign client
10+
*
11+
* @author Cade Li
12+
* @since 2023/7/28
13+
*/
14+
@FeignClient(contextId = "ExampleClient", name = SvcName.FRAMEWORK)
15+
public interface ExampleClient {
16+
17+
@PostMapping("example/test_str")
18+
String testStr(@RequestParam("str") String str);
19+
20+
}

framework/framework_api/src/main/java/com/github/cadecode/uniboot/framework/api/security/filter/JwtTokenAuthFilterService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
public class JwtTokenAuthFilterService extends TokenAuthFilterService {
2929

3030
@Override
31-
public void filter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
31+
public void handler(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
3232
String requestURI = request.getRequestURI();
3333
String jwtToken = SecurityUtil.getTokenFromRequest(request);
3434
// token 不存在

framework/framework_api/src/main/java/com/github/cadecode/uniboot/framework/api/security/filter/RedisTokenAuthFilterService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
public class RedisTokenAuthFilterService extends TokenAuthFilterService {
3333

3434
@Override
35-
public void filter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
35+
public void handler(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
3636
String requestURI = request.getRequestURI();
3737
String uuidToken = SecurityUtil.getTokenFromRequest(request);
3838
// token 不存在

framework/framework_api/src/main/java/com/github/cadecode/uniboot/framework/api/security/filter/TokenAuthFilterService.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
package com.github.cadecode.uniboot.framework.api.security.filter;
22

33
import cn.hutool.core.util.CharsetUtil;
4+
import cn.hutool.core.util.EscapeUtil;
5+
import cn.hutool.core.util.ObjectUtil;
46
import cn.hutool.extra.servlet.ServletUtil;
57
import cn.hutool.http.ContentType;
68
import com.github.cadecode.uniboot.common.core.enums.ApiErrorCode;
79
import com.github.cadecode.uniboot.common.core.extension.strategy.StrategyService;
810
import com.github.cadecode.uniboot.common.core.util.JacksonUtil;
911
import com.github.cadecode.uniboot.common.core.web.response.ApiResult;
12+
import com.github.cadecode.uniboot.framework.api.bean.dto.SysUserDto.SysUserDetailsDto;
13+
import com.github.cadecode.uniboot.framework.api.consts.SecurityConst;
1014
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
1115
import org.springframework.security.core.context.SecurityContextHolder;
1216
import org.springframework.security.core.userdetails.UserDetails;
@@ -54,5 +58,19 @@ protected void writeResponse(HttpServletResponse response, ApiErrorCode errorCod
5458
ServletUtil.write(response, JacksonUtil.toJson(result), ContentType.JSON.toString(CharsetUtil.CHARSET_UTF_8));
5559
}
5660

57-
public abstract void filter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException;
61+
public void filter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
62+
String escapedJson = ServletUtil.getHeader(request, SecurityConst.USER_DETAILS, CharsetUtil.CHARSET_UTF_8);
63+
if (ObjectUtil.isNotEmpty(escapedJson)) {
64+
SysUserDetailsDto userDetailsDto = JacksonUtil.toBean(EscapeUtil.unescape(escapedJson), SysUserDetailsDto.class);
65+
if (ObjectUtil.isNotNull(userDetailsDto)) {
66+
setAuthentication(request, userDetailsDto);
67+
filterChain.doFilter(request, response);
68+
return;
69+
}
70+
}
71+
handler(request, response, filterChain);
72+
}
73+
74+
public abstract void handler(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException;
75+
5876
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.github.cadecode.uniboot.framework.svc.controller;
2+
3+
import com.github.cadecode.uniboot.framework.api.annotation.ApiFormat;
4+
import io.swagger.annotations.Api;
5+
import io.swagger.annotations.ApiOperation;
6+
import lombok.RequiredArgsConstructor;
7+
import lombok.extern.slf4j.Slf4j;
8+
import org.springframework.web.bind.annotation.PostMapping;
9+
import org.springframework.web.bind.annotation.RequestMapping;
10+
import org.springframework.web.bind.annotation.RequestParam;
11+
import org.springframework.web.bind.annotation.RestController;
12+
13+
/**
14+
* 测试接口
15+
*
16+
* @author Cade Li
17+
* @since 2023/7/29
18+
*/
19+
@ApiFormat
20+
@Slf4j
21+
@RequiredArgsConstructor
22+
@Api(tags = "测试接口")
23+
@RestController
24+
@RequestMapping("example")
25+
public class ExampleController {
26+
27+
// For feign client
28+
@ApiFormat(false)
29+
@ApiOperation("传递字符串")
30+
@PostMapping("test_str")
31+
public String testStr(@RequestParam String str) {
32+
return str;
33+
}
34+
35+
}

0 commit comments

Comments
 (0)