JJWT身份验证
1.pom依赖:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.6.0</version>
</dependency>
2.创建类CreateJwtTest,用于生成token:
package com.ihrm.demo;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import javax.swing.*;
import java.util.Date;
public class CreateJwtTest {
/**
* 通过jjwt创建token
*/
public static void main(String[] args) {
JwtBuilder jwtBuilder = Jwts.builder().setId("88") //用户ID
.setSubject("小白") //用户名 ;当然也可以设置其它数据,并非必须要用户名
.setIssuedAt(new Date()) //记录签发时间
.signWith(SignatureAlgorithm.HS256 //加密算法,自己选择一种
, "ihrm") //加密私钥
.claim("companyId","123456") //可以继续设置数据 自定义claim中的内容
.claim("companyName","江苏传智播客教育股份有限公司")//可以继续设置数据 自定义claim中的内容
;
String token = jwtBuilder.compact(); //构造出token字符串
System.out.println(token);
}
}
3.解析jwtToken字符串
package com.ihrm.demo;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
public class ParseJwtTest {
/**
* 解析jwtToken字符串
*/
public static void main(String[] args) {
String token = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4OCIsInN1YiI6IuWwj-eZvSIsImlhdCI6MTU0MzMwODM1NiwiY29tcGFueUlkIjoiMTIzNDU2IiwiY29tcGFueU5hbWUiOiLmsZ_oi4_kvKDmmbrmkq3lrqLmlZnogrLogqHku73mnInpmZDlhazlj7gifQ.lacFfiWnBkbCQuHIwsB-S7gRkXxesTx8GOhhtIjALLI";
Claims claims = Jwts.parser()
.setSigningKey("ihrm") //私钥
.parseClaimsJws(token) //加密字符窜
.getBody();
//私有数据存放在claims
System.out.println(claims.getId()); //获取用户id
System.out.println( claims.getSubject()); //用户名
System.out.println(claims.getIssuedAt());//签发时间
//解析获取自定义claim中的内容
String companyId = (String)claims.get("companyId");
String companyName = (String)claims.get("companyName");
System.out.println(companyId + "---" + companyName);
}
}
4.自己封装工具类:
ckage com.ihrm.common.utils;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.Date;
import java.util.Map;
@Getter
@Setter
@ConfigurationProperties("jwt.config") //加载设置的key与失效时间
public class JwtUtils {
//签名私钥
private String key;
//签名的失效时间
private Long ttl;
/**
* 设置认证token
* id:登录用户id
* subject:登录用户名
*
*/
public String createJwt(String id, String name, Map<String,Object> map) {
//1.设置失效时间
long now = System.currentTimeMillis();//当前毫秒
long exp = now + ttl;
//2.创建jwtBuilder
JwtBuilder jwtBuilder = Jwts.builder().setId(id).setSubject(name)
.setIssuedAt(new Date())
.signWith(SignatureAlgorithm.HS256, key);
//3.根据map设置claims
for(Map.Entry<String,Object> entry : map.entrySet()) {
jwtBuilder.claim(entry.getKey(),entry.getValue());
}
//设置token失效的一个时间
jwtBuilder.setExpiration(new Date(exp));
//4.创建token
String token = jwtBuilder.compact();
return token;
}
/**
* 解析token字符串获取clamis
*/
public Claims parseJwt(String token) {
Claims claims = Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody();
return claims;
}
}
配置文件:
application.yml
#服务配置
server:
port: 9002
#spring配置
spring:
#1.应用配置
application:
name: ihrm-system #指定服务名
#2.数据库连接池
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/ihrm?useUnicode=true&characterEncoding=utf8
username: root
password: 111111
#3.JPA
jpa:
database: MySQL
show-sql: true
open-in-view: true
jwt:
config:
key: saas-ihrm
ttl: 3600000