前面我们已经实现了登录,为了验证用户日后的请求是否有效,我们生成一个token给用户,用户将token保存起来,用户每次发送请求时我们验证其token是否有效,下面使用JWT生成token并返回给用户。
1. 添加JWT依赖
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.13</version>
</dependency>
2. 使用JWT生成Token
由下图可以看出,JWT主要有三部分组成,其中的payload
、signatrue
是我们要提供的,payload
就是一些键值对,里面可以存放用户信息,signatrue
就是一个签名算法。
@Resource
AuthenticationManager authenticationManager;
@PostMapping("/login2")
public String login(@ModelAttribute LoginParams loginParams){
//1. 创建一个UsernamePasswordAuthenticationToken
UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(loginParams.getUsername(), loginParams.getPassword());
//2. 使用authenticationManager进行认证
Authentication authentication = authenticationManager.authenticate(usernamePasswordAuthenticationToken);
//3. 检查是否认证成功:null就是不成功
if(authentication == null) return "failed";
//使用jwt工具生成token
MyUserDetails userDetails = (MyUserDetails) authentication.getPrincipal();
Map<String, Object> payload = new HashMap<>();
payload.put("username", userDetails.getUsername());
JWTSigner jwtSigner = JWTSignerUtil.hs512("testttttt".getBytes(StandardCharsets.UTF_8));
String token = JWTUtil.createToken(payload, jwtSigner);
return token;
}
使用postman进行测试,成功返回token:
3. 验证token的有效性
@Test
void varifyToken() {
//验证token的有效性
String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJ1c2VybmFtZSI6InRlc3QgdXNlcm5hbWUifQ.Sr21-L8xR0trhJdDE8aBNHvl_2BXkqZQRcpTTIaPJ37FxBfqeSFeGqvaWZ5CrLXkZVwW9rE9lPBuZ3wH3PZqnw";
JWTSigner jwtSigner = JWTSignerUtil.hs512("testttttt".getBytes(StandardCharsets.UTF_8));
Boolean verify1 = JWTUtil.verify(token, jwtSigner);
log.info(verify1.toString());
//取出token里的信息
String username = (String)JWTUtil.parseToken(token).getPayload("username");
log.info("username = {}", username);
}
注意,其中的签名算法要和你当初生成token时的签名算法及其密钥一样。