首页 > Java > java教程 > 正文

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

霞舞
发布: 2025-11-15 20:02:00
原创
918人浏览过

限制 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" 权限的令牌才能访问受保护的端点。由于刷新令牌不包含此权限,因此只能用于刷新令牌端点。

妙刷AI
妙刷AI

美团推出的一款新奇、好玩、荒诞的AI视觉体验工具

妙刷AI 57
查看详情 妙刷AI

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 声明名称保持一致,以避免身份验证和授权问题。虽然本文没有涉及刷新令牌的单次使用,但是可以考虑将刷新令牌存储在数据库中,并在每次使用后将其删除,以实现单次使用的功能。这需要额外的数据库操作和管理,但可以进一步提高安全性。

以上就是限制 JWT 刷新令牌的使用范围的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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