在 Spring Cloud Gateway 中创建 JWT 黑名单

Posted

技术标签:

【中文标题】在 Spring Cloud Gateway 中创建 JWT 黑名单【英文标题】:Create JWT Blacklist in Spring Cloud Gateway 【发布时间】:2020-06-17 18:23:09 【问题描述】:

我将 spring 云网关与 oauth2 登录集成。在 scg 中注销后,用户仍然可以访问资源服务器,因为用户拥有有效的令牌。我需要以某种方式使这个有效令牌无效。我的研究有黑名单解决方案(https://***.com/a/53994938/5079581),我会实施这个。

通过创建过滤器,我在“/logout”步骤中将jwt放入黑名单。

public class ExampleWebFilter implements WebFilter 

    @Override
    public Mono<Void> filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) 
        ServerHttpRequest request = serverWebExchange.getRequest();
        String uri = request.getPath().pathWithinApplication().value();
        HttpHeaders headers = request.getHeaders();
        if(uri.equals("/logout")) 
            List<String> auth = headers.get("Authorization");
        

        return webFilterChain.filter(serverWebExchange);
    


auth 列表总是返回 null。我认为我的过滤器在令牌中继过滤器之前工作。如何在网关访问 jwt?是否有任何代码示例或演示?谢谢。

【问题讨论】:

如果您已经解决了,能否请您发布您的答案。我遇到了同样的问题,正在尝试解决它 【参考方案1】:

在spring cloud gateway + security oauth2 集成中,JWTs 作为 session 存储在 gateway 中。起初,我认为将 JWT 保存为会话存在错误,因为它变成了有状态的。但是,当您注销时,此会话被删除,不再有 JWT,因此 无需创建黑名单。这种工作方式是一个聪明的解决方案。

那么,我的问题是什么? 我有 2 个单独的服务器(网关、oauth2 服务器)。作为操作的结果创建了两个会话。 SESSION 用于网关,JSESSION 用于 oauth2 服务器。当您在网关上注销时,只删除了 SESSION,但 JSESSION 仍然存在。因此,网关进入 oauth 服务器(并且仍然登录 oauth2 服务器)并获取新的 JWT。

要完全退出系统,您还需要同时退出ouath2服务器

【讨论】:

以上是关于在 Spring Cloud Gateway 中创建 JWT 黑名单的主要内容,如果未能解决你的问题,请参考以下文章

spring cloud gateway 如何工作

spring cloud gateway 某些路由中跳过全局过滤器

spring cloud gateway 的执行流程

聊聊spring cloud gateway的NettyConfiguration

Spring Cloud Gateway 远程代码执行漏洞(CVE-2022-22947)

Spring Cloud Gateway集成