当前位置:   article > 正文

11-OAuth2.0实战:网关层统一认证授权_reactiveauthenticationmanager作用

reactiveauthenticationmanager作用

上一节介绍了认证中心,这节介绍下网关如何集成认证中心实现网关的统一认证授权。

木谷博客系统的整个认证授权架构设计如下图:

网关在这里的主要功能就是6-8这三步:

  1. 校验token:对令牌的过期时间、签名进行校验
  2. 鉴权:对令牌的权限进行校验
  3. 转发:解析令牌中的相关信息,通过请求头加密转发给下游微服务

检验TOKEN

对令牌的有效性进行校验,只需要实现ReactiveAuthenticationManager这个接口,其中authenticate进行校验,主要逻辑:根据tokenStore解析JWT令牌,然后对其中的过期时间、签名进行校验。代码如下:

第一处的代码主要是解析令牌的基本想信息,比如令牌的类型,过期时间

第二处的代码是解析令牌携带的用户身份信息,比如用户的用户名…

鉴权

木谷博客系统中的鉴权仅仅是针对接口,其他的一些系统有别的资源,比如前端的按钮、页面。。。

鉴权只需要实现ReactiveAuthorizationManager这个接口,实现其中的check方法。

自定义com.mugu.blog.gateway.config.JwtAuthorizationManager,主要逻辑如下:

  1. 从redis中获取该接口所对应的角色集合(这个在认证中心那一节将接口、角色对应关系加载到Redis)
  2. 解析令牌中的角色集合
  3. 接口所需的角色集合和令牌的角色集合比对,有交集则通过认证(超管root用户直接放行)

白名单

木谷博客系统目前未登录的用户是可以直接访问的,因此无需鉴权,将前端涉及到的接口设置到白名单即可。

白名单只需要在配置文件中配置即可,前缀为:oauth.server.ignore

@Component
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "oauth.server.ignore")
@Data
public class WhiteUrls {
    private List<String> urls;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在nacos中查看下blog-gateway.yaml,白名单配置如下:

oauth:
  # JWT令牌的key
  server:
    ignore:
      urls:
        - /blog-auth-server/oauth/token
        - /blog-auth-server/oauth/authorize
        - /blog-auth-server/oauth/check_token
        - /swagger-ui.html
        - /swagger-ui/*
        - /swagger-resources/**
        - /v2/api-docs
        - /v3/api-docs
        - /webjars/**
        - /doc.html
        - /**/v2/api-docs
        - /blog-article/front/**
        - /blog-picture/front/**
        - /blog-friendlinks/front/**
        - /blog-comments/comment/list
        - /blog-comments/comment/add
        - /blog-comments/message/add
        - /blog-comments/message/list
        - /actuator/**
        - /instances/**
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

想要白名单生效,只需要在Spring Securtiy的配置文件中(com.mugu.blog.gateway.config.SecurityConfig)设置过滤规则,代码如下:

转发

token校验、鉴权通过后,网关层面需要将token中携带的用户信息解析,传递给下游服务,这样下游服务就不必重新解析了。

大致逻辑:

  1. 定义过滤器
  2. 过滤器中将token的用户身份信息解析
  3. 将解析后的身份信息重新封装、加密,放入请求头中

1、定义过滤器

使用的是Gateway的全局过滤器GlobalFilter,定义如下:

/**
 * @author 公众号:码猿技术专栏
 * 全局过滤器,对token的拦截,解析token放入header中,便于下游微服务获取用户信息
 * 分为如下几步:
 *  1、白名单直接放行
 *  2、校验token
 *  3、读取token中存放的用户信息
 *  4、重新封装用户信息,加密成功json数据放入请求头中传递给下游微服务
 	com.mugu.blog.gateway.filter.GlobalAuthenticationFilter
 */
@Component
@Slf4j
public class GlobalAuthenticationFilter implements GlobalFilter, Ordered {}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2、解析token

通过TokenStore获取令牌中的身份信息,代码如下:

主要逻辑就是从additionalInformation中取出增强的信息

3、封装、加密放入请求头

第二步将令牌解析,获取了全部的身份信息,此时的通过JSONObject将这些用户信息封装、加密,放入请求头中,如下:

这样一来,下游微服务只需要从请求头中取出信息,进行解密即可。

黑名单校验

在全局过滤器中还有一个重要步骤:黑名单的校验

在第9节中介绍到:用户注销登录,则将该JWT放入redis黑名单中,失效时间为令牌剩余过期时间。

因此在过滤器中必须对黑名单进行检验,如果该JWT已经被加入了黑名单,则直接拦截。

代码如下:

总结

本节课主要介绍了网关层面的认证和授权,主要内容如下:

  1. 实现ReactiveAuthenticationManager对token的校验(过期时间、签名)
  2. 实现ReactiveAuthorizationManager对token的鉴权
  3. 对特定的资源配置白名单,直接放行
  4. 利用网关的全局过滤器,对token解析、加密放入请求头传递给下游服务。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/84142
推荐阅读
相关标签
  

闽ICP备14008679号