系统开发来讲,安全验证永远是最重要的,从最原始的session、cookie验证方式,到符合restful风格、满足前后端分离需求、启用https请求,各方面都在不断变化中。本文以jwt(json web token)的实践为例,介绍一二。 首先,来看一下jwt的概念,流程图如下所示: 流程图 用户发起登录请求,服务端创建一个加密后的jwt信息,作为token返回值,在后续请求中jwt信息作为请求头,服务端正确解密后可获取到存储的用户信息,表示验证通过;解密失败说明token无效或者已过期。 加密后jwt信息如下所示,是由.分割的三部分组成,分别为Header、Payload、Signature。 eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJqd3QiLCJpYXQiOjE0NzEyNzYyNTEsInN1YiI6IntcInVzZXJJZFwiOjEsXCJyb2xlSWRcIjoxfSIsImV4cCI6MTQ3MTMxOTQ1MX0.vW-pPSl5bU4dmORMa7UzPjBR0F6sqg3n3hQuKY8j35o 1 2 Header包含两部分信息,alg指加密类型,可选值为HS256、RSA等等,typ=JWT为固定值,表示token的类型。 { "alg": "HS256", "typ": "JWT" } 1 2 3 4 5 Payload是指签名信息以及内容,一般包括iss (发行者), exp (过期时间), sub(用户信息), aud (接收者),以及其他信息,详细介绍请参考官网。 { "sub": "1234567890", "name": "John Doe", "admin": true } 1 2 3 4 5 6 Signature则为对Header、Payload的签名。 HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret) 1 2 在jwt官网,可以看到有不同语言的实现版本,这里使用的是java版的jjwt。话不多说,直接看代码,加解密都很简单: /** * 创建 jwt * @param id * @param subject * @param ttlMillis * @return * @throws Exception */ public String createJWT(String id, String subject, long ttlMillis) throws Exception { SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256 ; long nowMillis = System. currentTimeMillis(); Date now = new Date( nowMillis); SecretKey key = generalKey(); JwtBuilder builder = Jwts. builder() .setId(id) .setIssuedAt(now) .setSubject(subject) .signWith(signatureAlgorithm, key); if (ttlMillis >= 0){ long expMillis = nowMillis + ttlMillis; Date exp = new Date( expMillis); builder.setExpiration( exp); } return builder.compact(); } /** * 解密 jwt * @param jwt * @return * @throws Exception */ public Claims parseJWT(String jwt) throws Exception{ SecretKey key = generalKey(); Claims claims = Jwts. parser() .setSigningKey( key) .parseClaimsJws( jwt).getBody(); return claims; } 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 加解密的key是通过固定字符串转换而生成的;subject为用户信息的json字符串;ttlMillis是指token的有效期,时间较短,需要定时更新。 这里要介绍的token刷新方式,是在生成token的同时生成一个有效期较长的refreshToken,后续由客户端定时根据refreshToken来获取最新的token。浏览器与服务端之间建立sse(server send event)请求,来实现刷新。关于sse在前面博文中有介绍过,此处略过不提。 本文完整源代码存放于github,地址:https://github.com/ahmu/spring-authorization-demo。 参考资料: 1.jwt官方网站:https://jwt.io/ 2.jjwt项目:https://github.com/jwtk/jjwt 3.Introduction to JSON Web Tokens:https://jwt.io/introduction/ 4.How to Create and verify JWTs in Java: https://stormpath.com/blog/jwt-java-create-verify
相关推荐
Spring Boot、Spring Security和JWT(JSON Web Token)的组合提供了一种高效且灵活的方式来实现权限管理。这个“springboot+springSecurity+jwt实现的基于token的权限管理的一个demo”旨在演示如何在Spring Boot应用...
结合JWT(JSON Web Token)和Shiro,我们可以构建一个高效的身份验证和授权系统,同时利用Redis缓存来提高性能和用户体验。下面将详细介绍如何在Spring Boot中整合JWT、Shiro和Redis实现Token自动刷新。 JWT是一种...
本项目是基于Spring Boot、Spring Security和JWT(Json Web Token)技术栈实现的基于Token的权限管理系统。这些技术都是Java生态系统中的核心组件,广泛用于现代Web应用开发。接下来,我们将详细讨论这些技术以及...
Spring Boot、Spring Security和JWT(JSON Web Token)的组合提供了一种高效且灵活的方式来实现权限管理。这个基于"springboot+springSecurity+jwt实现的基于token的权限管理"的示例项目,旨在帮助开发者理解和实践...
在本项目中,我们主要关注的是SpringBoot 2.7版本与多个技术的深度整合,包括Spring Security、JWT(JSON Web Token)、Redis缓存以及MySQL数据库,并利用MyBatis作为持久层框架。以下是对这些技术及其整合应用的...
本示例项目“基于SpringBoot+SpringSecurity+jwt实现的基于token的权限管理demo”提供了一个很好的起点,帮助新手理解如何在SpringBoot框架中集成SpringSecurity和JWT(JSON Web Token)来实现代理认证和授权。...
在这个主题中,我们将深入探讨如何使用Spring Security结合JSON Web Token (JWT) 实现token认证和授权。 JWT 是一种轻量级的、安全的、无状态的身份验证机制,常用于API的鉴权。它通过在客户端和服务器之间传递令牌...
在本项目中,我们主要探讨的是如何将Java与Spring Boot框架相结合,利用JWT(JSON Web Token)和Spring Security来构建一个安全的Web应用程序。这个实战项目涵盖了从基础概念到实际应用的完整流程,旨在帮助开发者...
本项目是一个基于SpringBoot、SpringSecurity和JWT(JSON Web Token)技术的权限管理系统演示。这个Demo旨在展示如何整合这些技术,实现基于Token的身份验证和授权,为现代Web应用提供安全的访问控制。 首先,...
而JWT(JSON Web Token)则是一种轻量级的身份验证机制,广泛用于现代Web应用的安全认证。在本项目中,我们将深入探讨如何在Spring Boot中整合JWT,实现安全的用户认证。 首先,让我们了解JWT的基本原理。JWT由三...
Json Web Token(JWT)是一种轻量级的身份验证和授权机制,广泛应用于Web应用程序,特别是单页应用(SPA)和微服务架构中。JWT通过在客户端和服务器之间传递JSON编码的信息来实现用户认证,无需在服务器端存储会话...