Spring Cloud Gateway 整合 OAuth2.0 实现分布式统一认证授权③
3、认证管理器自定义
新建一个JwtAuthenticationManager,需要实现ReactiveAuthenticationManager这个接口。
认证管理的作用就是获取传递过来的令牌,对其进行解析、验签、过期时间判定。
详细代码如下:
逻辑很简单,就是通过JWT令牌服务解析客户端传递的令牌,并对其进行校验,比如上传三处校验失败,抛出令牌无效的异常。
抛出的异常如何处理?如何定制返回的结果?
这里抛出的异常可以通过Spring Cloud Gateway的全局异常进行捕获,这个内容在Spring Cloud Gateway夺命连环10问?这篇文章有详细介绍。下面只贴出关键代码,如下:
4、鉴权管理器自定义
经过认证管理器JwtAuthenticationManager认证成功后,就需要对令牌进行鉴权,如果该令牌无访问资源的权限,则不允通过。
新建JwtAccessManager,实现ReactiveAuthorizationManager,代码如下:
这里的逻辑很简单,就是取出令牌中的权限和当前请求资源URI的权限对比,如果有交集则通过。
①处的代码什么意思?
这里是直接从Redis中取出资源URI对应的权限集合,因此实际开发中需要维护资源URI和权限的对应关系,这里不细说,为了演示,陈某直接在项目启动的时候向Redis中添加了两个资源的权限,代码如下:
“注意:实际开发中需要维护资源URI和权限的对应关系。”
②处的代码什么意思?
这处代码就是取出令牌中的权限集合
③处的代码什么意思?
这处代码就是比较两者权限了,有交集,则放行。
5、令牌无效或者过期时定制结果
在第4步,如果令牌失效或者过期,则会直接返回,这里需要定制提示信息。
新建一个RequestAuthenticationEntryPoint,实现ServerAuthenticationEntryPoint,代码如下:
6、无权限时定制结果
在第4步鉴权的过程中,如果无该权限,也是会直接返回,这里也需要定制提示信息。
新建一个RequestAccessDeniedHandler,实现ServerAccessDeniedHandler,代码如下:
文章转自公众号:码猿技术专栏