域名

Serverless 安全增强篇:整合 OAuth2 + Token 黑名单 + Redis 缓存机制

字号+作者:益华科技来源:IT科技2025-11-05 08:25:13我要评论(0)

随着 Serverless 架构的广泛应用,传统 Web 应用中依赖 Session 的认证模式面临重大挑战。本文将以 Spring Security 为核心,构建一套无状态、可扩展、支持 OAuth

随着 Serverless 架构的安全广泛应用,传统 Web 应用中依赖 Session 的增强制认证模式面临重大挑战。本文将以 Spring Security 为核心,篇整构建一套无状态、合On黑s缓可扩展、名单支持 OAuth2、存机JWT、安全Redis 黑名单与 Refresh Token 的增强制安全认证体系,适用于 Serverless 应用场景。服务器租用篇整

Serverless 应用的合On黑s缓安全挑战

Serverless 应用的无状态特性决定了其认证模型不能依赖传统的会话管理。核心挑战包括:

Serverless 安全增强篇:整合 OAuth2 + Token 黑名单 + Redis 缓存机制

身份认证用户身份需要跨请求验证,名单无 Session。存机权限校验如何高效识别用户角色与权限。安全Token 生命周期管理访问令牌的增强制过期续签、注销。篇整密钥管理JWT 签名密钥的亿华云计算安全管理。

Spring Security + JWT 构建轻量认证模型

我们采用如下组件构建无状态认证体系:

组件

作用

JWT

用户身份令牌,无状态传递

OAuth2

多客户端支持与统一授权

Redis

黑名单 + RefreshToken 存储

Spring Security

安全拦截器与权限控制

系统结构设计图 复制+-----------------------------+ | 前端调用接口 | +-----------------------------+ | v +-----------------------------+ | API网关 / Serverless函数 | +-----------------------------+ | v +-----------------------------+ | Spring Security + Token拦截 | +-----------------------------+ | v +------------+ Redis +-------------+ | JWT Token校验 | <----> | Token黑名单 | +------------+ +-------------+ | v +--------------------------+ | 用户业务逻辑处理 | +--------------------------+1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.

关键模块代码实现

Spring Boot 启动类 复制@SpringBootApplication public class ServerlessSecurityApplication { public static void main(String[] args) { SpringApplication.run(ServerlessSecurityApplication.class, args); } }1.2.3.4.5.6. Security 配置类(无状态、JWT、资源服务器) 复制@Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { return http .csrf(csrf -> csrf.disable()) .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authorizeHttpRequests(auth -> auth .requestMatchers(\"/api/public/**\", \"/api/token/refresh\").permitAll() .anyRequest().authenticated()) .oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults())) .build(); } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17. JWT 工具类 复制public class JwtUtils { private static final Key key = Keys.hmacShaKeyFor(\"0123456789abcdef0123456789abcdef\".getBytes()); public static String generateAccessToken(String username, String roles, String jti) { return Jwts.builder() .setSubject(username) .setId(jti) .claim(\"roles\", roles) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() + 3600_000)) // 1小时 .signWith(key) .compact(); } public static String generateRefreshToken(String username, String jti) { return Jwts.builder() .setSubject(username) .setId(jti) .claim(\"type\", \"refresh\") .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() + 7 * 24 * 3600_000)) // 7天 .signWith(key) .compact(); } public static Claims getClaims(String token) throws JwtException { return Jwts.parserBuilder() .setSigningKey(key) .build() .parseClaimsJws(token) .getBody(); } }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.26.27.28.29.30.31.32.33.34.35.36.37.38. Redis Token 黑名单工具类 复制@Component public class TokenBlacklistUtil { private final StringRedisTemplate redisTemplate; public TokenBlacklistUtil(StringRedisTemplate redisTemplate) { this.redisTemplate = redisTemplate; } public void blacklistToken(String jti, long ttlSeconds) { redisTemplate.opsForValue().set(\"blacklist:\" + jti, \"1\", ttlSeconds, TimeUnit.SECONDS); } public boolean isTokenBlacklisted(String jti) { return redisTemplate.hasKey(\"blacklist:\" + jti); } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21. RefreshToken 存储与刷新接口 复制@RestController @RequestMapping(\"/api/token\") public class TokenController { @Autowired private StringRedisTemplate redisTemplate; @PostMapping(\"/refresh\") public ResponseEntity<?> refresh(@RequestParam String refreshToken) { Claims claims = JwtUtils.getClaims(refreshToken); String jti = claims.getId(); String username = claims.getSubject(); // 校验类型与黑名单 if (!\"refresh\".equals(claims.get(\"type\"))) { return ResponseEntity.badRequest().body(\"非法 token 类型\"); } if (!Boolean.TRUE.equals(redisTemplate.hasKey(\"refresh:\" + jti))) { return ResponseEntity.status(401).body(\"refreshToken 已失效\"); } // 生成新 token String newJti = UUID.randomUUID().toString(); String newAccessToken = JwtUtils.generateAccessToken(username, \"USER\", newJti); return ResponseEntity.ok(Map.of(\"accessToken\", newAccessToken)); } }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.26.27.28.29.30.31.32.33.34.35. 登录、退出控制器(模拟) 复制@RestController @RequestMapping(\"/api/auth\") public class AuthController { @Autowired private StringRedisTemplate redisTemplate; @Autowired private TokenBlacklistUtil blacklistUtil; @PostMapping(\"/login\") public Map<String, String> login(@RequestParam String username) { String jti = UUID.randomUUID().toString(); String accessToken = JwtUtils.generateAccessToken(username, \"USER\", jti); String refreshToken = JwtUtils.generateRefreshToken(username, jti); // 保存 refreshToken 到 redis redisTemplate.opsForValue().set(\"refresh:\" + jti, username, 7, TimeUnit.DAYS); return Map.of(\"accessToken\", accessToken, \"refreshToken\", refreshToken); } @PostMapping(\"/logout\") public ResponseEntity<Void> logout(@RequestHeader(\"Authorization\") String authHeader) { String token = authHeader.replace(\"Bearer \", \"\"); Claims claims = JwtUtils.getClaims(token); String jti = claims.getId(); long remaining = (claims.getExpiration().getTime() - System.currentTimeMillis()) / 1000; blacklistUtil.blacklistToken(jti, remaining); // 同时清除 refreshToken redisTemplate.delete(\"refresh:\" + jti); return ResponseEntity.ok().build(); } }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.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42. application.yml 配置 复制spring: security: oauth2: resourceserver: jwt: issuer-uri: https://auth.icoderoad.com/oauth2 jwk-set-uri: https://auth.icoderoad.com/oauth2/jwks redis: host: localhost port: 63791.2.3.4.5.6.7.8.9.10.

总结

无状态 Serverless 环境下,Spring Security 可通过 JWT、OAuth2 与 Redis 轻松实现高效认证体系:

不依赖 Session支持访问控制 + 黑名单管理Refresh Token 保证登录体验Redis 做 Token 生命周期缓存

今天就讲到这里,如果有问题需要咨询,大家可以直接留言或扫下方二维码来知识星球找我,我们会尽力为你解答。源码下载

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 电脑循环风扇机箱安装教程(轻松学习如何正确安装电脑循环风扇机箱)

    电脑循环风扇机箱安装教程(轻松学习如何正确安装电脑循环风扇机箱)

    2025-11-05 07:54

  • 假如你一直关注新闻,那么就知道Ubuntu将会切换到带有Unity 8桌面的Mir显示服务器。然而,在尚未确定运行在 Mir 上的Unity 8是否会出现在Ubuntu 15.10 Willy Werewolf之前,有了一个Unity 8的预览版本可供你体验和测试。通过官方PPA,可以很容易地安装Unity 8到Ubuntu 14.04,14.10和15.04中。到目前为止,开发者已经可以通过ISO(主要途径)获得该Unity 8预览来进行测试。不过Canonical也通过LXC容器发布了它。通过该方法,你可以使用Unity 8桌面会话,让它像其它桌面环境一样运行在Mir显示服务器上。就像你在Ubuntu中安装Mate桌面,然后从LightDm登录屏幕选择桌面会话一样。想要试试Unity 8?让我们来看怎样安装它吧。注意: 它是一个实验性预览,可能不是所有人都可以让它正确工作的。安装Unity 8桌面到Ubuntu下面是安装并使用Unity 8的步骤:步骤 1: 安装Unity 8到Ubuntu 12.04和14.04假如你正运行着Ubuntu 12.04和14.04,那么你必须使用官方PPA来安装Unity 8。使用以下命令进行安装:sudo apt-add-repository ppa:unity8-desktop-session-team/unity8-preview-lxcsudo apt-get updatesudo apt-get upgradesudo apt-get install unity8-lxc步骤 2: 设置Unity 8桌面预览LXC安装Unity 8 LXC后,该对它进行设置,下面的命令就可达到目的:sudo unity8-lxc-setup它将花费一些时间来设置,所以,耐心点。它会下载ISO,然后解压缩,接着完成最后一些必要的设置来让它工作。它也会安装一个LightDM的轻度修改版本。这一切都搞定后,需要重启。步骤 3: 选择Unity 8重启后,在登录屏幕,点击你的登录旁边的Ubuntu图标:你应该可以在这看到Unity 8的选项,选择它:卸载Unity 8 LXC假如你发现Unity 8毛病太多,或者你不喜欢它,那么你可以以相同的方式切换回默认Unity版本。此外,你也可以通过下面的命令移除Unity 8:sudo apt-get remove unity8-lxc该命令会将Unity 8选项从LightDM屏幕移除,但是配置仍然保留着。以上就是你在Ubuntu中安装带有Mir的Unity 8的全部过程,试玩后请分享你关于Unity 8的想法哦!

    假如你一直关注新闻,那么就知道Ubuntu将会切换到带有Unity 8桌面的Mir显示服务器。然而,在尚未确定运行在 Mir 上的Unity 8是否会出现在Ubuntu 15.10 Willy Werewolf之前,有了一个Unity 8的预览版本可供你体验和测试。通过官方PPA,可以很容易地安装Unity 8到Ubuntu 14.04,14.10和15.04中。到目前为止,开发者已经可以通过ISO(主要途径)获得该Unity 8预览来进行测试。不过Canonical也通过LXC容器发布了它。通过该方法,你可以使用Unity 8桌面会话,让它像其它桌面环境一样运行在Mir显示服务器上。就像你在Ubuntu中安装Mate桌面,然后从LightDm登录屏幕选择桌面会话一样。想要试试Unity 8?让我们来看怎样安装它吧。注意: 它是一个实验性预览,可能不是所有人都可以让它正确工作的。安装Unity 8桌面到Ubuntu下面是安装并使用Unity 8的步骤:步骤 1: 安装Unity 8到Ubuntu 12.04和14.04假如你正运行着Ubuntu 12.04和14.04,那么你必须使用官方PPA来安装Unity 8。使用以下命令进行安装:sudo apt-add-repository ppa:unity8-desktop-session-team/unity8-preview-lxcsudo apt-get updatesudo apt-get upgradesudo apt-get install unity8-lxc步骤 2: 设置Unity 8桌面预览LXC安装Unity 8 LXC后,该对它进行设置,下面的命令就可达到目的:sudo unity8-lxc-setup它将花费一些时间来设置,所以,耐心点。它会下载ISO,然后解压缩,接着完成最后一些必要的设置来让它工作。它也会安装一个LightDM的轻度修改版本。这一切都搞定后,需要重启。步骤 3: 选择Unity 8重启后,在登录屏幕,点击你的登录旁边的Ubuntu图标:你应该可以在这看到Unity 8的选项,选择它:卸载Unity 8 LXC假如你发现Unity 8毛病太多,或者你不喜欢它,那么你可以以相同的方式切换回默认Unity版本。此外,你也可以通过下面的命令移除Unity 8:sudo apt-get remove unity8-lxc该命令会将Unity 8选项从LightDM屏幕移除,但是配置仍然保留着。以上就是你在Ubuntu中安装带有Mir的Unity 8的全部过程,试玩后请分享你关于Unity 8的想法哦!

    2025-11-05 07:10

  • windows 7鼠标移动到桌面右下方的显示桌面没反应的解决方法

    windows 7鼠标移动到桌面右下方的显示桌面没反应的解决方法

    2025-11-05 06:23

  • windows 7让媒体中心支持更多视频格式的方法

    windows 7让媒体中心支持更多视频格式的方法

    2025-11-05 06:14

网友点评