SpringCloud 服务鉴权

2,935 阅读3分钟

1、服务鉴权:服务鉴权的流程

用户访问我们的微服务,都需要经过网关作为请求入口,网关对用户身份进行验证,从而保证微服务的安全。但是,大家有没有思考过这样一个问题:

如果你的微服务地址不小心暴露了呢?

一旦微服务地址暴露,用户就可以绕过网关,直接请求微服务,那么我们之前做的一切权限控制就白费了!

因此,我们的每个微服务都需要对调用者的身份进行认证,如果不是有效的身份,则应该阻止访问。

合法的调用者身份,其实就是其它微服务,还有网关。我们首先需要把这些合法的调用者身份存入数据库,并给每一个调用者都设置密钥。接下来的步骤就简单了:

  • 当访问某个微服务时,需要携带自己的身份信息,比如密钥

  • 被调用者验证身份信息身份合法

  • 如果验证通过则放行,允许访问

因此,我们必须在一个微服务来管理调用者身份、权限、当然还包括用户的权限,角色等,并对外提供验证调用者身份、查询调用者权限的接口,我们可以再授权中心中完成这些业务。

1)版本1-密码认证

流程图:



加入服务鉴权流程后有没有什么问题呢?

服务调用本来是访问者(client)与微服务(server)之间的交互,但是为了验证身份,不得不与授权中心交互。每次请求都会比原来多一次网络交互,效率大大降低。

能不能只验证一次呢?

2)版本2-令牌认证

如果我们将第一次验证后的身份信息生成一个令牌(token),以后每次请求携带这个token,只要验证token有效,就无需每次调用授权中心验证身份了!

服务调用方需要向授权中心申请令牌,而后每次请求微服务都携带这个令牌即可,而令牌的生成我们依然使用JWT规范来实现。如图:


整个过程是不是跟用户登录也请求服务有点像啊?

没错,其实服务授权,就是把微服务也当做用户来看待。区别在于服务授权无需注册,而是有管理人员提前录入服务及服务的权限信息。

不过这里依然有问题需要思考:

  • 请求令牌的动作什么时候做?

  • 令牌过期以后如何生成新令牌?

3)版本3-令牌自动刷新

  • 问题1:请求令牌的动作什么时候做?

    • 我们肯定不希望频繁去申请令牌,所以应该在项目启动的时候,携带身份信息,去授权中心申请令牌,然后保存起来。

    • 这个可以通过自定义配置类,在配置类中完成令牌的申请和保存,而配置类会在项目启动时加载

  • 问题2:令牌过期以后如何生成新令牌?

    • 虽然我们不希望频繁去申请令牌,但是出于安全考虑,令牌最好有一定的过期时间,然后定期更新。

    • 既然是定期更新,当然是定时任务来完成了

如图:


关键的步骤如下:

  • 授权中心提供接口:验证身份,签发jwt

  • 所有微服务中通过定时任务,向授权中心发起请求,获取jwt

  • 微服务每次请求都携带jwt在请求头中

  • 被访问服务拦截请求,判断请求头中的jwt身份合法