• JWT生成tonken验证+AOP拦截验证


    JSON Web Token(JWT)是目前都在用的前后分离跨域验证规则。

    JWT由3部分组成

    • Header——头部一般Base64URL编码,作用:声明token类型,声明token使用的加密算法。一般都是使用HMAC-SHA256或者RSA支持很多种算法(HS256、HS384、HS512、RS256、RS384、RS512、ES256、ES384、ES512、PS256、PS384)
    • PayLoad——载荷(自定义数据)也叫消息体(payload)是一个JSON对象。一般Base64URL编码。存储用户信息,过期时间等等。。。因为载荷里面包含可以包含许多用户自定义信息,所以后端不用再频繁的与数据库进行交互,可以直接获取信息。但是这也导致载荷里不建议储存敏感信息,因为可以直接Base64URL解密就能看到了,当然你也可以额外再加密。  这些有效信息包含三个部分:标准中注册的声明、公共的声明和私有的声明
    • Signature(签名其实是由Header+PayLoad+自定义密钥再由加密算法(HS256)或者其他算法生成。这也是jwt安全的真正原因)

    1、引入依赖pom.xml

    1. <dependency>
    2. <groupId>com.auth0groupId>
    3. <artifactId>java-jwtartifactId>
    4. <version>3.8.2version>
    5. dependency>

    2、编写jwt工具类JwtUtil.java

    1. package com.muchuantong.util;
    2. import java.util.Date;
    3. import java.util.HashMap;
    4. import java.util.List;
    5. import java.util.Map;
    6. import com.auth0.jwt.JWT;
    7. import com.auth0.jwt.JWTVerifier;
    8. import com.auth0.jwt.algorithms.Algorithm;
    9. import com.auth0.jwt.interfaces.Claim;
    10. import com.auth0.jwt.interfaces.DecodedJWT;
    11. /**
    12. * @Author: Zou Tiancong
    13. * @Date: 2021/12/1 0001 10:37
    14. * @Annotation:jwtToken
    15. */
    16. public class JwtUtil {
    17. // 设置过期时间
    18. private static final long EXPIRE_DATE = 60*1000;
    19. // token秘钥
    20. private static final String TOKEN_SECRET = "TEST-AUTH-TOKEN";
    21. // 实现签名方法
    22. public static String token(String id, String openId, String nickName) {
    23. String token = "";
    24. try {
    25. // 这里将用户存入了Token,在下面的解析中,也会有解析的方法可以获取到Token里面的数据
    26. // Token过期的时间
    27. Date expireDate = new Date(System.currentTimeMillis() + EXPIRE_DATE);
    28. // 秘钥及加密算法
    29. Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
    30. // 设置头部信息,类型以及签名所用的算法
    31. Map header = new HashMap<>();
    32. header.put("typ", "JWT");
    33. header.put("alg", "HS256");
    34. // 携带用户信息,存入token,生成签名
    35. token = JWT.create()
    36. .withHeader(header) //设置头部信息Header
    37. .withIssuer("TEST") //设置签名是由谁生成
    38. .withSubject("AUTH-TOKEN") //设置签名的主题
    39. .withAudience(nickName) //设置签名的观众
    40. .withIssuedAt(new Date()) //设置生成签名的时间
    41. .withExpiresAt(expireDate) //设置签名过期的时间
    42. .withClaim("id", id) //自定义信息
    43. .withClaim("openId", openId)//自定义信息
    44. .withClaim("nickName", nickName)//自定义信息
    45. .withJWTId(id) //jwt的id,主要用来作为一次性token,从而回避重放攻击
    46. .sign(algorithm);
    47. } catch (Exception e) {
    48. e.printStackTrace();
    49. return null;
    50. }
    51. return token;
    52. }
    53. // 验证token
    54. public static boolean verify(String token) {
    55. /**
    56. * @desc 验证token,通过返回true
    57. * @params [token]需要校验的串
    58. **/
    59. try {
    60. Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
    61. JWTVerifier verifier = JWT.require(algorithm).build();
    62. DecodedJWT jwt = verifier.verify(token);
    63. String subject = jwt.getSubject();
    64. List audience = jwt.getAudience();
    65. Map claims = jwt.getClaims();
    66. System.out.println(subject+"*******"+audience);
    67. for (Map.Entry entry : claims.entrySet()){
    68. String key = entry.getKey();
    69. Claim claim = entry.getValue();
    70. String value = claim.asString();
    71. System.out.println("key:"+key+" value:"+value);
    72. }
    73. return true;
    74. } catch (Exception e) {
    75. e.printStackTrace();
    76. System.out.println("Token已过期,需要重新登录");
    77. }
    78. return false;
    79. }
    80. // 生成token
    81. public static String setToken(String id, String openId, String nickName) {
    82. String token = token(id, openId, nickName);
    83. return token;
    84. }
    85. }

    2、自定义注解接口Auth.java

    1. package com.muchuantong.util;
    2. import java.lang.annotation.*;
    3. /**
    4. * Created with IntelliJ IDEA.
    5. *
    6. * @Auther: ZouTiancong
    7. * @Date: 2022/05/23/22:37
    8. * @Description:
    9. */
    10. @Target({ ElementType.TYPE, ElementType.METHOD })
    11. @Retention(RetentionPolicy.RUNTIME)
    12. @Documented
    13. public @interface Auth {
    14. boolean token() default true;
    15. }

    3、自定义注解APO实现类AuthAspect.java

    1. package com.muchuantong.util;
    2. import javax.servlet.http.HttpServletRequest;
    3. import org.aspectj.lang.ProceedingJoinPoint;
    4. import org.aspectj.lang.annotation.Around;
    5. import org.aspectj.lang.annotation.Aspect;
    6. import org.aspectj.lang.annotation.Pointcut;
    7. import org.aspectj.lang.reflect.MethodSignature;
    8. import org.springframework.beans.factory.annotation.Autowired;
    9. import org.springframework.stereotype.Component;
    10. /**
    11. * Created with IntelliJ IDEA.
    12. *
    13. * @Auther: ZouTiancong
    14. * @Date: 2022/05/23/22:39
    15. * @Description:
    16. */
    17. @Component
    18. @Aspect
    19. public class AuthAspect {
    20. @Autowired
    21. private HttpServletRequest request;
    22. @Pointcut("@annotation(com.muchuantong.util.Auth)")
    23. private void authPointcut() {
    24. }
    25. @Around("authPointcut()")
    26. public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
    27. // 获取方法签名信息从而获取方法名和参数类型
    28. MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
    29. // 获取目标方法对象上注解中的属性值
    30. Auth auth = methodSignature.getMethod().getAnnotation(Auth.class);
    31. // 校验签名
    32. if (auth.token()) {
    33. boolean token = JwtUtil.verify(request.getHeader("token"));
    34. // 如果token校验失败返回
    35. if (!token) {
    36. return new Result<>("401", "token已过期,请重新登录!");
    37. }
    38. }
    39. return joinPoint.proceed();
    40. }
    41. }

    4、在需要token验证的地方加入注解@Auth

     5、前端调用查看效果,token生成返回成功,后端也能成功读取数据

  • 相关阅读:
    加密与安全_探索数字证书
    SQLMAP插件tamper编写与使用
    LabVIEW调用MathScript Window
    java基于SpringBoot+vu的疫情网课授课作业管理系统 elementui
    js:Class对象中的函数,在使用 this 时理解
    洛谷-P1106-删数问题
    CSS 计数器之 counter()
    java项目-第90期基于ssm的嘟嘟二手书商城系统
    适用于车载设备无钥匙进入系统汽车用晶振FA-238A
    javascript基础七:说说你对Javascript中作用域的理解?
  • 原文地址:https://blog.csdn.net/qq_37346639/article/details/128140068