1、jwt原理
JWT(JSON Web Token)是一种用于身份验证和授权的开放标准(RFC 7519)。它是一种轻量级的令牌格式,用于在网络应用间传输声明(claims)。JWT使用JSON对象来编码声明,并使用数字签名(或加密)以确保声明的完整性和安全性。
1.1、内容:
内容包含三个部分:头部(Header)、载荷(Payload)和签名(Signature):
头部(Header):
头部通常由两部分组成:令牌的类型(typ)和使用的签名算法(alg)。常见的签名算法包括 HMAC SHA256(HS256)、RSA SHA256(RS256)等。头部会通过Base64编码后放置在JWT的第一个部分。
载荷(Payload):
载荷包含了一组声明(claims),用于携带关于用户和其他实体的信息。有三种类型的声明:
Registered Claims(注册声明):这些是预定义的声明,包含一些标准字段,如iss(签发者)、sub(主题)、exp(过期时间)、aud(受众)等。
Public Claims(公共声明):这些是自定义的声明,可以根据应用程序的需求添加任意的字段。
Private Claims(私有声明):这些是自定义的声明,用于在双方之间共享信息,但不建议在JWT中公开传输。
载荷会被Base64编码后放置在JWT的第二个部分。
签名(Signature):
签名是对头部和载荷进行签名的结果,以确保JWT的完整性和真实性。签名通常使用头部中指定的算法和密钥进行计算。签名可以防止未经授权的修改和篡改JWT。签名是JWT的第三个部分。
完整的JWT由这三个部分通过点号(.)连接而成,形如:xxxxx.yyyyy.zzzzz。
2、springBoot项目使用springSecurity框架实现单点登录demo
2.1、创建一个最基本的springBoot项目(此处略),然后引入springSecurity、redis、jwt相关依赖 <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--spring security-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!--jwt的依赖-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.2</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
2.2、配置类及工具类代码实现
jwt工具类
2.3、业务代码。。。。
实体类
最简单的user
2.4 测试
代码可以直接运行,跑起来以后,请求登录接口,从response中拿到headers中Key为Authorization的值,就是token
然后再请求别的接口,如代码中的test接口,和登录接口不一样,它一定要在请求头中添加上Authorization这个键值对,不然会报403异常。