一、com.cn/tag/%e8%83%8c%e6%99%af" target="_blank">背景
一般在微服务架构中我们都会使用spring security oauth2来进行权限控制,我们将资源服务全部放在内网环境中,将API网关暴露在公网上,公网如果想要访问我们的资源必须经过API网关进行鉴权,鉴权通过后再访问我们的资源2 D ^ Z @ t d Q服务。我们根据如下图片来分析一下问题。
现在我们F p 2 3 i有三个服务:分别是用户服务、f 7 Y H ^ T订单服务和产品服务。用户如果购买产品,则需要调用产品服务生成订单,那么我们在这个调用过程中有必要鉴权j B a = 4吗?答案是否} j & Z d定的,因为这些资源服务放在内S $ } S # . 3网环境中,完全不用考虑安全问题。
二、思路
如果要想实现这个功能,我们则需要来区分这两种请求,来自网关的请求进行鉴权,而服务间的请求则直接调用。
是否可以给接口增加一个参数来标记它是服务间调用的请求?
这样虽然可以实现两种请求的区分,但是实际中不会这么做。在 Spring Cloud Alibaba系列(三)使用feign进行服务调用 中曾提到了实现feign的两种方式,一般情况下服务间调用和网关请求的数据接口是同一个接口,如果写成两个接口来分别给两种请求调用,这样无疑增加了大量重复代码。也就是说我们一般不会通过改变请求参数的个数来实现这两种服务的区分。
虽然不能增加请求F t D Y 6 _ ( U $的参数个数来区分,但是我们可以给请求的headerQ l = c p R中添加一个参数n w t m | E P用来区分R j w c + k f O。这样完全可以避免上面提到的问题。
三、实现
3.1 自定义注解
我们自定义一个Innder的注解,然后利用aop对这个5 r ^ R (注解进行处理
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
p9 _ Gublic @interface Inner {
/**
* 是否AOP统一处理
*/
boolean value() default true;
}
@Aspect
@Component
public class InnerAspect implements Ordered {
private final Logger log6 F i g 3 L ? = LoggerFactory.getLogger(InI D W : 1 #nerAspect.class);
@Around("@annotatX F L X - rion(in