请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于鉴权

老师好,结合你的两门课程,我实现了一套安全模块,目前完成了认证服务,现在正在做权限验证,有几个一直苦恼着我。我想到3种方案,老师看下是否合理或者有没有更好的方案。
认证流程我们就不过了,假设已经获得token
1:携带token经过网关访问到某个服务,与认证服务类似,同样访问权限认证服务(独立的服务),如果权限认证通过,则放行请求到具体的服务。这个方案我想到2个问题,第一是光认证和授权就有2次http请求,感觉网络开销比较大,第二是权限认证服务需维护的权限信息会一直变大,导致认证速度变慢,变慢会导致认证回调超时,可能出现有权限的情况下,因为响应问题请求被降级而提示没有权限。
2:携带token经过网关,token认证通过后,直接访问到具体的服务,各个服务维护自己的权限数据,并各个服务自行校验权限。这个方案我想到3个问题,第一是每个微服务的权限怎么同步(系统启动时和权限修改时,使用消息总线进行通知重新装载权限?),第二是用户携带的token一般不会携带权限信息,权限信息怎么获取,获取到的权限如何缓存(存储到redis?),第三是这样设计是否存在老师所说的业务服务与权限耦合。
3:权限资源在网关中存储,携带token经由网关调用认证服务认证通过后,网关鉴权,鉴权通过后放行访问具体的服务。这个方案与第一个相比减少了一次http请求,但仍然感觉会有第一种方案的第二个问题出现。
以上3种方案是我想到的,我看了很多开源的微服务脚手架,他们采用的方案大部分是第二种,其次是第一种。我比较倾向于第二和第三种,还请老师给出意见。

正在回答

1回答

JoJo 2019-09-20 11:02:45

我们的做法是jwt做认证,然后在网关调redis鉴权,微服务之间只通过sentinel做粗粒度的黑白名单。后面的章节有说明。如果请求量不大,这个方案可以。如果性能要求更高,可以考虑网关启动时把权限读到网关的内存里,然后通过消息同步。总结下:1.细粒度权限在网关做。2.微服务之间调用只做粗粒度的黑白名单。3.权限在启动时读到网关,后续通过消息同步。

1 回复 有任何疑惑可以回复我~
  • 提问者 月光下的初恋 #1
    明白了,谢谢老师
    回复 有任何疑惑可以回复我~ 2019-09-20 12:59:54
  • 提问者 月光下的初恋 #2
    如果鉴权在网关中处理,是不是意味着业务服务中完全没有权限的概念了。
    回复 有任何疑惑可以回复我~ 2019-09-20 13:03:36
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信