36、关于资源服务鉴权流程
使用springcloud框架时,最常用的鉴权流程框架是spring Security和OAuth2,OAuth2是SpringSecurity的扩展版;OAuth2.0有两种方式:
1、授权服务与资源服务属于同一进程(同一服务)
2、资源服务与授权服务分离(不属于同一进程)
对于第一种情况,我们很好区分,访问对应资源和授权数据同一进程,无需在配置文件中进行任何配置,但对于第二种情况,很可能是我们最常用的,一般情况下,我们的资源服务会独立出来一个服务,授权服务独立出来,只有需要鉴权验证的时候才会由资源服务转向授权服务进行验证!以下我们针对第二种情况进行具体的流程说明。
资源服务与授权服务分离
问题: 资源服务与授权服务分离的情况下,在鉴权服务授权资源路径可以被任意用户访问配置无效(permitAll)
说明:项目中我们最常用的就是从外网访问到内网必经之路就是网关,鉴权的方式有两种
(1)通过网关统一鉴权,通过后即可访问对应的资源服务或后台服务
(2)网关不做校验,对应的所有后台服务或资源服务统各自到授权服务进行验证
此处,我选择的肯定是第一种方式,由网关统一进行验证,原因很简单,第一网关服务与后台服务是系统内部服务,内部服务之间是可信任的,无需鉴权;第二,由各自到授权中心鉴权流程很复杂,会显得平台非常杂乱;第三,通过网关后的请求到达资源服务后鉴权无效仍产生内部服务交互,浪费流量和系统资源;第四,授权服务以一敌多,不用多说。项目的具体思路如下:
解答:
针对改问题,我只能一步一步调试所有的SpringSecurity的源码(具体的调试步骤:在Controller中添加一个可以访问的方法,断点调试,通过堆栈查看最原始的过滤器,找到与Security和OAuth相关的过滤器,然后一步一步调试),最后跟进的源码鉴权的具体流程如下:
步骤:
1、外网请求经过网关。
2、SpringSecurity获取请求参数access_token
3、如果请求参数携带access_token,资源服务根据application配置的请求验证url和用户id秘钥等信息到授权中心进行验证;
4、如果请求的参数不携带access_token,那么说明请求的是本地资源,本地资源就使用本地资源服务授权信息进行验证(ResourceServer的configure(HttpSecurity http) )
5、通过第3或4步骤验证的url即可通过网关路由到对应的服务(如果是授权服务或者其他同样配置了资源服务的依然受其资源服务配置鉴权验证)
6、转发请求到服务并响应结果。