八、创建JWT工具类

     JWTToken 要经过加密才能返回给客户端,包括客户端上传的 Token ,后端项目需要验证核

实。于是我们需要一个 JWT 工具类,用来 加密 Token 验证 Token 的有效性.
1、导入依赖项
1. 
2. org.apache.shiro
3. shiro-web
4. 1.5.3
5. 
6. 
7. org.apache.shiro
8. shiro-spring
9. 1.5.3
10. 
11. 
12. com.auth0
13. java-jwt
14. 3.10.3
15. 
16. 
17. org.springframework.boot
18. spring-boot-configuration-processor
19. true
20. 
21. 
22. org.apache.commons
23. commons-lang3
24. 3.11
25. 
26. 
27. org.apache.httpcomponents
28. httpcore
29. 4.4.13
30. 
31. 
32. org.springframework.boot
33. spring-boot-starter-aop
34. 

二、定义密钥和过期时间

     我建议大家把密钥和过期时间定义到SpringBoot配置文件中,然后再值注入到JavaBean中,这样维护起来比较方便。

八、创建JWT工具类_第1张图片 

 emos: 2. jwt: 3. #密钥
4. secret: abc123456
5. #令牌过期时间(天)
6. expire: 5 7. #令牌缓存时间(天数)
8. cache-expire: 10

三、创建JWT工具类

八、创建JWT工具类_第2张图片

 

package com.example.emos.wx.config.shiro;

import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component

@SpringBootApplication
@Slf4j
public class JwtUtil {
    @Value("${emos.jwt.secret}")
    private String secret;

    @Value("${emos.jwt.expire}")
    private int expire;

    public String createToken(int userId){
        Date date=DateUtil.offset(new Date(), DateField.DAY_OF_YEAR,5);
        Algorithm algorithm=Algorithm.HMAC256(secret);
        JWTCreator.Builder builder= JWT.create();
        String token=builder.withClaim("userId",userId).withExpiresAt(date).sign(algorithm);
        return token;
    }

    public int getUserId(String token){
        DecodedJWT jwt=JWT.decode(token);
        int userId=jwt.getClaim("userId").asInt();
        return userId;
    }

    public void verifierToken(String token){
        Algorithm algorithm=Algorithm.HMAC256(secret);
        JWTVerifier verifier=JWT.require(algorithm).build();
        verifier.verify(token);
    }
}

四、把令牌封装成认证对象

我们通过JwtUtil类可以生成 Token ,这个 Token 我们是要返回给客户端的。接下来 我们要把 JWT Shiro框架 对接起来,这样 Shiro框架 就会拦截所有的Http请求,然后验证请求 提交的 Token 是否有效。

八、创建JWT工具类_第3张图片

  客户端提交的Token不能直接交给Shiro框架,需要先封装成 AuthenticationToken 类型的对象,

所以我们我们需要先创建 AuthenticationToken 的实现类。

 

八、创建JWT工具类_第4张图片
package com.example.emos.wx.config.shiro;

import org.apache.shiro.authc.AuthenticationToken;

public class OAuth2Token implements AuthenticationToken {
    private String token;

    public OAuth2Token(String token) {
        this.token = token;
    }

    @Override
    public Object getPrincipal() {
        return token;
    }

    @Override
    public Object getCredentials() {
        return token;
    }
}

你可能感兴趣的:(服务器,运维)