【pig-cloud项目】关于@Inner和@PreAuthorize的理解,以及微服务内外部间的调用认证鉴权理解

本文围绕pig-cloud项目,探讨微服务内外部调用认证鉴权问题。分析了常见调用场景及pig项目的实现逻辑,阐述了@Inner和@PreAuthorize注解的使用,指出@Inner注解接口拿不到用户认证信息及内部调用的安全问题,还给出了修改pig微服务内部调用认证鉴权逻辑的方法。

学习pig-cloud项目时遇到了微服务内外部间的调用认证鉴权理解这个问题,总理解不了文档Inner注解使用说明 · 语雀中的文字,然后看过源码,并用代码测试后,理解并总结一下,怕自己忘记,脑子不够用~ (ಥ﹏ಥ)

文章中没有代码说明,只是逻辑理解,代码可以看这个系列下的文章:【学习笔记】记录冷冷-pig项目的学习过程,大概包括Authorization Server、springcloud、Mybatis Plus~~~_清晨敲代码的博客-CSDN博客_pig项目学习

目录

A1.微服务内外部间的调用认证鉴权理解

B1.个人理解

B2.pig项目中的实现

A2.关于@Inner和@PreAuthorize的理解(只基于pig项目代码)

B1.举个例子理解

B2.结论:被 @Inner(true/false) 注释的接口不能拿到用户认证信息

B3.@Inner注解内部调用安全性问题

A3.修改 pig 微服务内部调用认证鉴权逻辑


A1.微服务内外部间的调用认证鉴权理解

B1.个人理解

首先,先不看pig 项目,就单纯从微服务内外部间的调用鉴权来说,通常有两点是需要保证的:

1. 内部服务间Feign访问永远都不需要认证鉴权,但可以传递认证信息;(没遇到过内部服务之间调用需要鉴权的情况)
2. 外部访问通过Gateway访问,不会也不应该直接访问某服务;(没遇到过微服务场景下直接访问某服务的情况)

基于以上两点和正常开发,会有以下几点调用接口的应用场景:

1. 外部从Gateway访问、外部直接访问某服务和内部服务间Feign访问,都不需要认证鉴权;
2. 外部从Gateway访问需要认证鉴权;外部不能直接访问某服务;内部服务间Feign访问不需要认证鉴权;
3. 外部从Gateway访问需要认证鉴权;外部直接访问某服务需要鉴权;内部服务间Feign访问不需要认证鉴权;

场景 3. 是针对场景 2. 的一个补充,外部直接访问某服务需要认证鉴权的情况也应该是存在的。

【没看明白我的理解,可以看 pig 文档中的:Inner注解使用说明 · 语雀,不知道为什么我是没理解他的说明,我是从源代码里看明白后才看懂的 o(╥﹏╥)o】

B2.pig项目中的实现

明白微服务内外部间的调用认证鉴权的场景后,再来看 pig 项目的实现,这个项目中的逻辑是实现了上面的场景 1.2. ,第三点没有实现。

项目中 1.2. 场景的代码实现逻辑是:

1.如果是全部不需要认证鉴权,那么各个服务中只需要将这个接口添加到security过滤链的permitAll白名单即可;

2.外部从Gateway访问需要认证鉴权的情况,就按照正常的授权端给服务添加过滤器(BearerTokenAuthenticationFilter)和鉴权(鉴权注解@PreAuthorize)就可以。

而如果再加上外部不能直接访问某服务,并且内部服务间Feign访问不需要认证鉴权,的情况,就会在启动项目时先将该接口动态的添加到security过滤链的permitAll白名单,和校验accesstoken的白名单(BearerTokenResolver)中,然后在调用接口时直接通过security过滤链,然后通过注解@Inner的value值判断是否是内部调用,true则表示是内部调用,false表示不是内部调用。

但是由于此接口已经是白名单不鉴权了,为了防止外部直接访问,于是添加了一个@RequestHeader(SecurityConstants.FROM)参数值的来校验是内部调用,也就是说当@Inner的value=true,并且@RequestHeader(SecurityConstants.FROM)的参数值能够匹配上我们定义的值(相当于是密码了),就能够直接访问;如果@Inner的value=false,则相当于接口完全对外暴露了。

同时 pig 项目还在gateway网关里面添加了一个 header 过滤,会将header=From的参数值去掉,没太明白这个步骤的意义,这样仅仅是能够防止通过网关来调用仅能够内部调用的接口,如果定义的header=From的参数值暴露了,用户依旧可以通过添加header=From值来调用@Inner(value=true)的接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值