Skip to content

Commit e9b01d3

Browse files
committed
feat: 封装判断是否内部调用的方法
1 parent 0a45528 commit e9b01d3

2 files changed

Lines changed: 51 additions & 14 deletions

File tree

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

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
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;
54
import cn.hutool.core.util.ObjectUtil;
65
import cn.hutool.extra.servlet.ServletUtil;
76
import cn.hutool.http.ContentType;
@@ -10,7 +9,7 @@
109
import com.github.cadecode.uniboot.common.core.util.JacksonUtil;
1110
import com.github.cadecode.uniboot.common.core.web.response.ApiResult;
1211
import com.github.cadecode.uniboot.framework.api.bean.dto.SysUserDto.SysUserDetailsDto;
13-
import com.github.cadecode.uniboot.framework.api.consts.SecurityConst;
12+
import com.github.cadecode.uniboot.framework.api.util.RequestUtil;
1413
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
1514
import org.springframework.security.core.context.SecurityContextHolder;
1615
import org.springframework.security.core.userdetails.UserDetails;
@@ -63,18 +62,12 @@ protected void writeResponse(HttpServletResponse response, ApiErrorCode errorCod
6362
* 由 handler 方法提供处理
6463
*/
6564
public void filter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
66-
// 根据请求头判断是否是内部请求
67-
String source = ServletUtil.getHeader(request, SecurityConst.HEAD_SOURCE, CharsetUtil.CHARSET_UTF_8);
68-
if (ObjectUtil.equal(source, SecurityConst.HEAD_SOURCE_VALUE)) {
69-
// 从请求头中提取来自其他服务调用传递得用户信息
70-
String escapedUserDetailsJson = ServletUtil.getHeader(request, SecurityConst.HEAD_USER_DETAILS, CharsetUtil.CHARSET_UTF_8);
71-
if (ObjectUtil.isNotEmpty(escapedUserDetailsJson)) {
72-
SysUserDetailsDto userDetailsDto = JacksonUtil.toBean(EscapeUtil.unescape(escapedUserDetailsJson), SysUserDetailsDto.class);
73-
if (ObjectUtil.isNotNull(userDetailsDto)) {
74-
setAuthentication(request, userDetailsDto);
75-
filterChain.doFilter(request, response);
76-
return;
77-
}
65+
if (RequestUtil.isInnerRequest(request)) {
66+
SysUserDetailsDto userDetailsDto = RequestUtil.getInnerUserDetails(request);
67+
if (ObjectUtil.isNotNull(userDetailsDto)) {
68+
setAuthentication(request, userDetailsDto);
69+
filterChain.doFilter(request, response);
70+
return;
7871
}
7972
}
8073
handler(request, response, filterChain);

framework/framework_api/src/main/java/com/github/cadecode/uniboot/framework/api/util/RequestUtil.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
package com.github.cadecode.uniboot.framework.api.util;
22

3+
import cn.hutool.core.util.CharsetUtil;
4+
import cn.hutool.core.util.EscapeUtil;
35
import cn.hutool.core.util.ObjectUtil;
6+
import cn.hutool.extra.servlet.ServletUtil;
7+
import com.github.cadecode.uniboot.common.core.util.JacksonUtil;
8+
import com.github.cadecode.uniboot.framework.api.bean.dto.SysUserDto.SysUserDetailsDto;
9+
import com.github.cadecode.uniboot.framework.api.consts.SecurityConst;
410
import org.springframework.web.context.request.RequestContextHolder;
511
import org.springframework.web.context.request.ServletRequestAttributes;
612

@@ -30,4 +36,42 @@ public static HttpServletResponse getResponse() {
3036
}
3137
return requestAttributes.getResponse();
3238
}
39+
40+
/**
41+
* 根据请求头判断是否是内部请求
42+
*
43+
* @param request 请求对象,为 null 时自动从上下文获取
44+
* @return 是否是内部请求
45+
*/
46+
public static boolean isInnerRequest(HttpServletRequest request) {
47+
if (ObjectUtil.isNull(request)) {
48+
request = getRequest();
49+
}
50+
if (ObjectUtil.isNull(request)) {
51+
return false;
52+
}
53+
String source = ServletUtil.getHeader(request, SecurityConst.HEAD_SOURCE, CharsetUtil.CHARSET_UTF_8);
54+
return ObjectUtil.equal(source, SecurityConst.HEAD_SOURCE_VALUE);
55+
}
56+
57+
/**
58+
* 根据请求头获取内部请求携带的用户信息
59+
*
60+
* @param request 请求对象,为 null 时自动从上下文获取
61+
* @return 内部请求携带的用户信息
62+
*/
63+
public static SysUserDetailsDto getInnerUserDetails(HttpServletRequest request) {
64+
if (ObjectUtil.isNull(request)) {
65+
request = getRequest();
66+
}
67+
if (ObjectUtil.isNull(request)) {
68+
return null;
69+
}
70+
// feign 拦截器填充时做了转义处理
71+
String escapedUserDetailsJson = ServletUtil.getHeader(request, SecurityConst.HEAD_USER_DETAILS, CharsetUtil.CHARSET_UTF_8);
72+
if (ObjectUtil.isNotEmpty(escapedUserDetailsJson)) {
73+
return JacksonUtil.toBean(EscapeUtil.unescape(escapedUserDetailsJson), SysUserDetailsDto.class);
74+
}
75+
return null;
76+
}
3377
}

0 commit comments

Comments
 (0)