Skip to content

Commit 05a5bbb

Browse files
committed
feat: 添加 ApiInner 注解及切面,对内部调用进行管控
1 parent 1eed2d3 commit 05a5bbb

4 files changed

Lines changed: 91 additions & 3 deletions

File tree

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.github.cadecode.uniboot.framework.api.annotation;
2+
3+
import java.lang.annotation.*;
4+
5+
/**
6+
* 标识供内部调用的接口
7+
* 当有些内部调用不方便传递 token 时(比如异步线程中的 feign 调用,无法直接拿到 token 请求头等)
8+
* 可以将接口配置到 security ignore url 列表中,将不再需要登录
9+
*
10+
* @author Cade Li
11+
* @since 2023/8/1
12+
*/
13+
@Target({ElementType.METHOD})
14+
@Retention(RetentionPolicy.RUNTIME)
15+
@Documented
16+
public @interface ApiInner {
17+
18+
/**
19+
* 是否仅供内部调用
20+
* 用于防止接口被来自网关的流量随意访问
21+
*/
22+
boolean onlyClient() default false;
23+
24+
/**
25+
* 是否需要用户登录
26+
* 用于防止接口被未登录访问
27+
*/
28+
boolean requireUser() default false;
29+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.github.cadecode.uniboot.framework.api.aspect;
2+
3+
import cn.hutool.core.util.CharsetUtil;
4+
import cn.hutool.core.util.ObjectUtil;
5+
import cn.hutool.extra.servlet.ServletUtil;
6+
import com.github.cadecode.uniboot.common.core.exception.ApiException;
7+
import com.github.cadecode.uniboot.framework.api.annotation.ApiInner;
8+
import com.github.cadecode.uniboot.framework.api.consts.SecurityConst;
9+
import com.github.cadecode.uniboot.framework.api.enums.AuthErrorEnum;
10+
import com.github.cadecode.uniboot.framework.api.util.RequestUtil;
11+
import com.github.cadecode.uniboot.framework.api.util.SecurityUtil;
12+
import org.aspectj.lang.JoinPoint;
13+
import org.aspectj.lang.annotation.Aspect;
14+
import org.aspectj.lang.annotation.Before;
15+
import org.aspectj.lang.annotation.Pointcut;
16+
import org.aspectj.lang.reflect.MethodSignature;
17+
import org.springframework.stereotype.Component;
18+
19+
import javax.servlet.http.HttpServletRequest;
20+
21+
/**
22+
* ApiInner 注解检查切面
23+
*
24+
* @author Cade Li
25+
* @since 2023/8/2
26+
*/
27+
@Aspect
28+
@Component
29+
public class ApiInnerAspect {
30+
31+
@Pointcut("@annotation(com.github.cadecode.uniboot.framework.api.annotation.ApiInner)")
32+
public void pointCut() {
33+
}
34+
35+
@Before("pointCut()")
36+
public void rateLimit(JoinPoint point) {
37+
// 获取方法上的注解
38+
MethodSignature methodSignature = (MethodSignature) point.getSignature();
39+
// 获取注解
40+
ApiInner apiInner = methodSignature.getMethod().getAnnotation(ApiInner.class);
41+
// 获取 request
42+
HttpServletRequest servletRequest = RequestUtil.getRequest();
43+
if (ObjectUtil.isNull(servletRequest)) {
44+
return;
45+
}
46+
// 获取请求头
47+
String source = ServletUtil.getHeader(servletRequest, SecurityConst.HEAD_SOURCE, CharsetUtil.CHARSET_UTF_8);
48+
boolean innerFlag = ObjectUtil.equal(source, SecurityConst.HEAD_SOURCE_VALUE);
49+
// 判断是否仅供内部调用
50+
if (apiInner.onlyClient() && !innerFlag) {
51+
throw ApiException.of(AuthErrorEnum.TOKEN_NO_AUTHORITY, "ApiInner AOP:该接口仅供内部调用");
52+
}
53+
// 判断是否需要用户信息
54+
if (apiInner.requireUser() && !SecurityUtil.isAuthenticated(null)) {
55+
throw ApiException.of(AuthErrorEnum.TOKEN_NOT_EXIST, "ApiInner AOP:该接口要求用户登录");
56+
}
57+
}
58+
}

framework/framework_svc/src/main/java/com/github/cadecode/uniboot/framework/svc/controller/SysApiController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import cn.hutool.core.util.ObjectUtil;
44
import com.github.cadecode.uniboot.common.core.web.response.PageResult;
55
import com.github.cadecode.uniboot.framework.api.annotation.ApiFormat;
6+
import com.github.cadecode.uniboot.framework.api.annotation.ApiInner;
67
import com.github.cadecode.uniboot.framework.api.bean.po.SysApi;
78
import com.github.cadecode.uniboot.framework.api.bean.vo.SysApiVo.SysApiRolesVo;
89
import com.github.cadecode.uniboot.framework.api.bean.vo.SysApiVo.SysApiSwaggerVo;
@@ -121,8 +122,7 @@ public List<SysApiSwaggerVo> listSwaggerVo() {
121122
.collect(Collectors.toList());
122123
}
123124

124-
125-
// For feign client
125+
@ApiInner(onlyClient = true)
126126
@ApiFormat(false)
127127
@ApiOperation("查询API列表-全部")
128128
@PostMapping("list_roles_vo")

framework/framework_svc/src/main/java/com/github/cadecode/uniboot/framework/svc/controller/SysLogController.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.github.cadecode.uniboot.common.core.web.response.PageResult;
55
import com.github.cadecode.uniboot.common.plugin.mybatis.converter.BoolToIntTypeHandler;
66
import com.github.cadecode.uniboot.framework.api.annotation.ApiFormat;
7+
import com.github.cadecode.uniboot.framework.api.annotation.ApiInner;
78
import com.github.cadecode.uniboot.framework.api.bean.dto.SysLogDto.SysLogInfoDto;
89
import com.github.cadecode.uniboot.framework.api.bean.po.SysLog;
910
import com.github.cadecode.uniboot.framework.api.bean.vo.SysLogVo.SysLogPageVo;
@@ -66,7 +67,7 @@ public boolean delete(@RequestBody @NotEmpty List<Long> idList) {
6667
return logService.removeBatchByIds(idList);
6768
}
6869

69-
// For feign client
70+
@ApiInner(onlyClient = true)
7071
@ApiFormat(false)
7172
@ApiOperation("添加")
7273
@PostMapping("save")

0 commit comments

Comments
 (0)