0

0

限制 JWT 刷新令牌的使用范围

霞舞

霞舞

发布时间:2025-11-15 20:02:00

|

948人浏览过

|

来源于php中文网

原创

限制 jwt 刷新令牌的使用范围

本文将介绍如何通过 Spring Security 和 JWT(JSON Web Token)来限制刷新令牌只能用于特定的刷新令牌端点,从而增强系统的安全性。通过为访问令牌添加特定的权限,并配置 Spring Security 来强制执行这些权限,可以有效防止刷新令牌被用于访问其他受保护的资源。同时,还会提及关于JWT声明名称配置一致性的重要性。

限制刷新令牌的使用范围

在基于 JWT 的身份验证系统中,刷新令牌的目的是在访问令牌过期后,允许客户端无需重新输入用户名和密码即可获取新的访问令牌。然而,如果刷新令牌可以被用于访问任何受保护的资源,那么短期访问令牌的优势就会大打折扣。为了解决这个问题,我们可以采取以下策略:

  1. 为访问令牌添加特定权限: 为每个访问令牌添加一个特定的权限,例如 "access"。
  2. 配置 Spring Security: 配置 Spring Security,要求所有受保护的端点都必须具有 "access" 权限。
  3. 刷新令牌不包含该权限: 刷新令牌不包含 "access" 权限,因此无法用于访问其他端点。

代码示例

以下是如何在 JwtTokenServiceImpl 类中修改 generateAccessToken 方法,以添加 "access" 权限:

@Override
public String generateAccessToken(User user) {
    Instant now = Instant.now();
    String scope = user.getAuthorities().stream()
        .map(GrantedAuthority::getAuthority)
        .collect(Collectors.joining(" "));

    String accessScope = scope.concat(" access");

    JwtClaimsSet claims = JwtClaimsSet.builder()
        .issuer("self")
        .issuedAt(now)
        .expiresAt(now.plus(2, ChronoUnit.MINUTES))
        .subject(user.getUsername())
        .claim("roles", accessScope)
        .build();
    return this.jwtEncoder.encode(JwtEncoderParameters.from(claims)).getTokenValue();
}

接下来,在 WebSecurityConfig 类中,配置 Spring Security 以要求所有受保护的端点都必须具有 "ROLE_access" 权限:

http.authorizeHttpRequests()
    .requestMatchers("/auth/sign-in").permitAll()
    .requestMatchers("/auth/sign-up").permitAll()
    .anyRequest().hasAuthority("ROLE_access")
    .and()
    .httpBasic(Customizer.withDefaults())
    .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt);

通过以上配置,只有具有 "ROLE_access" 权限的令牌才能访问受保护的端点。由于刷新令牌不包含此权限,因此只能用于刷新令牌端点。

新秀B2C商城系统
新秀B2C商城系统

新秀B2C商城系统是一款简洁易用PHP商城系统。可免费下载使用,可用于商业用途,没有时效限制,除版权标识外,所有代码都允许修改。后台功能简介:1、商城设置:基本信息,配送方式,配送范围,支付方式,财务管理;2、商品管理:商品列表,添加商品,商品分类,商品品牌,商品属性;3、订单管理:订单列表,缺货登记;4、用户互动:用户管理,留言管理,评论管理,网站公告,在线客服,用户协议;5、文章管理:文章列表

下载

JWT 声明名称配置一致性

在配置 JWT 时,务必确保在整个应用程序中使用的声明名称保持一致。例如,如果在 WebSecurityConfig 类中将权限声明名称设置为 "roles":

jwtGrantedAuthoritiesConverter.setAuthoritiesClaimName("roles");

那么在 JwtTokenServiceImpl 类中生成 JWT 时,也应该使用 "roles" 作为声明名称:

JwtClaimsSet claims = JwtClaimsSet.builder()
    .issuer("self")
    .issuedAt(now)
    .expiresAt(now.plus(2, ChronoUnit.MINUTES))
    .subject(user.getUsername())
    .claim("roles", accessScope)
    .build();

如果在不同的地方使用了不同的声明名称(例如 "scope" 和 "roles"),Spring Security 将无法正确解析令牌中的权限信息,导致身份验证和授权失败。

总结

通过为访问令牌添加特定权限并配置 Spring Security,可以有效地限制刷新令牌的使用范围,从而提高系统的安全性。同时,务必确保在整个应用程序中使用的 JWT 声明名称保持一致,以避免身份验证和授权问题。虽然本文没有涉及刷新令牌的单次使用,但是可以考虑将刷新令牌存储在数据库中,并在每次使用后将其删除,以实现单次使用的功能。这需要额外的数据库操作和管理,但可以进一步提高安全性。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

98

2025.08.06

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

402

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

528

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

306

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6038

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

780

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1044

2023.12.21

桌面文件位置介绍
桌面文件位置介绍

本专题整合了桌面文件相关教程,阅读专题下面的文章了解更多内容。

0

2025.12.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.1万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号