添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

网关在这里的主要功能就是 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;

在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/**

想要白名单生效,只需要在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 {}

2、解析token

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

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

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

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

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

黑名单校验

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

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

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

代码如下:

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

  1. 实现ReactiveAuthenticationManager对token的校验(过期时间、签名)
  2. 实现ReactiveAuthorizationManager对token的鉴权
  3. 对特定的资源配置白名单,直接放行
  4. 利用网关的全局过滤器,对token解析、加密放入请求头传递给下游服务。
1.认证授权 ​ 最近学习整理了下认证授权相关实现,下面是大概的一些理解与学习过程。 ​ 在分布式系统中每个服务都需要认证授权。如果每个服务都实现一套认证授权的逻辑就会显得冗余,考虑到分布式系统共享性的特点,我们可以独立一个授权服务出来,可以对内部系统或者第三方应用提供认证。 1.1统一认证授权: ​ 提供独立的认证服务,统一处理认证授权。不论是什么用户还是不同种类的客户端,例如小程序,APP,web,都采用一致的认证,权限,会话机制。 ​ 同时保持开放性,可以接入第三方外 1.1 获取验证码 (1)生成图形验证码,将图形验证码保存到redis(key,value) public CloudwalkResult<AcCaptchaOutDTO> generateCaptcha() throws ServiceException { try { AcCaptchaDTO acCaptchaDTO = this.acCaptchaProcessor.generate(); ByteArrayOu 授权服务器的作用就是用来生成token,下面的代码主要是用来生成token,配置客户端信息,配置token生成方式 @Configuration @EnableAuthorizationServer public class AuthServerConfig extends AuthorizationServerConfigurerAdapter { @Autowired private AuthenticationMan
1.背景介绍 API(Application Programming Interface,应用编程接口)是一种软件组件提供给其他软件组件使用的一种接口,它定义了如何访问某个功能或者数据集。API 提供了一种标准的方式来访问和操作数据,使得不同的系统和应用程序可以相互通信和协作。 随着微服务架构的普及,API 成为了企业内部和外部系统之间交互的主要方式。然而,随着 API 的增多,API 安全也...
点击关注公众号,实用技术文章及时了解本文主要内容是通过SpringCloud Gateway构建一个网关微服务,作为统一认证授权和访问入口。配置文件先引入相关依赖,对应的pom文件内容如下:<?xmlversion="1.0"encoding="UTF-8"?> <projectxmlns="http://maven.apache.org/POM/4.0.0"
1.背景介绍 随着互联网的不断发展,网关在互联网应用中的重要性日益凸显。网关作为一种特殊的服务器,它位于网络的边缘,负责处理来自不同网络的请求,并将其转发到适当的服务器上。在这个过程中,网关需要对请求进行身份验证和授权,以确保网络安全。 身份验证是一种验证过程,用于确认用户或系统是否具有特定的身份。授权是一种访问控制机制,用于确定用户是否具有访问特定资源的权限。在网关中,身份验证和授权是两个重...
本案例就是API网关作为OAuth2.0的资源服务器角色,实现接入客户端权限拦截、令牌解析并转发当 前登录用户信息(jsonToken)给微服务,这样下游微服务就不需要关心令牌格式解析以及OAuth2.0相关机制了。 API网关认证授权体系里主要负责两件事: (1)作为OAuth2.0的资源服务器