From 03412935121b747bcb6cb2c646f3c0783c5e006c Mon Sep 17 00:00:00 2001 From: wzp Date: Sun, 7 Apr 2024 17:58:59 +0800 Subject: [PATCH] =?UTF-8?q?feat(all):=20=E6=B7=BB=E5=8A=A0=E4=BA=86JWT?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../annotations/AuthorizationRequired.java | 10 ++++ .../configuration/TokenConfiguration.java | 53 +++++++++++++++++++ .../mmga/clubs/controller/UserController.java | 6 +++ .../org/mmga/clubs/service/UserService.java | 3 ++ .../java/org/mmga/clubs/utils/JwtUtils.java | 7 +++ 5 files changed, 79 insertions(+) create mode 100644 src/main/java/org/mmga/clubs/annotations/AuthorizationRequired.java create mode 100644 src/main/java/org/mmga/clubs/configuration/TokenConfiguration.java diff --git a/src/main/java/org/mmga/clubs/annotations/AuthorizationRequired.java b/src/main/java/org/mmga/clubs/annotations/AuthorizationRequired.java new file mode 100644 index 0000000..661f83d --- /dev/null +++ b/src/main/java/org/mmga/clubs/annotations/AuthorizationRequired.java @@ -0,0 +1,10 @@ +package org.mmga.clubs.annotations; + +import java.lang.annotation.*; + +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface AuthorizationRequired { + +} diff --git a/src/main/java/org/mmga/clubs/configuration/TokenConfiguration.java b/src/main/java/org/mmga/clubs/configuration/TokenConfiguration.java new file mode 100644 index 0000000..6361dc0 --- /dev/null +++ b/src/main/java/org/mmga/clubs/configuration/TokenConfiguration.java @@ -0,0 +1,53 @@ +package org.mmga.clubs.configuration; + +import com.auth0.jwt.exceptions.JWTVerificationException; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.NonNull; +import lombok.extern.slf4j.Slf4j; +import org.mmga.clubs.annotations.AuthorizationRequired; +import org.mmga.clubs.entities.BaseResponse; +import org.mmga.clubs.utils.JwtUtils; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.nio.charset.StandardCharsets; + +@Configuration +@Slf4j +public class TokenConfiguration implements HandlerInterceptor, WebMvcConfigurer{ + private final JwtUtils jwtUtils; + public TokenConfiguration(JwtUtils jwtUtils){ + this.jwtUtils = jwtUtils; + } + @Override + public boolean preHandle(@NonNull HttpServletRequest request,@NonNull HttpServletResponse response,@NonNull Object handler) throws Exception { + if (handler instanceof HandlerMethod handlerMethod){ + if (handlerMethod.hasMethodAnnotation(AuthorizationRequired.class)){ + String authorization = request.getHeader("Authorization"); + try{ + jwtUtils.verifyToken(authorization); + }catch (JWTVerificationException e){ + log.debug("用户鉴权时出现错误:", e); + ServletOutputStream outputStream = response.getOutputStream(); + response.addHeader("Content-Encoding", "UTF-8"); + //TODO 使用fastjson2 进行json序列化 + BaseResponse err = BaseResponse.failed(401, "token错误"); + outputStream.write(err.toString().getBytes(StandardCharsets.UTF_8)); + outputStream.close(); + return false; + } + return true; + } + } + return true; + } + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(this); + } +} diff --git a/src/main/java/org/mmga/clubs/controller/UserController.java b/src/main/java/org/mmga/clubs/controller/UserController.java index 702e41c..827edf4 100644 --- a/src/main/java/org/mmga/clubs/controller/UserController.java +++ b/src/main/java/org/mmga/clubs/controller/UserController.java @@ -5,6 +5,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; +import org.mmga.clubs.annotations.AuthorizationRequired; import org.mmga.clubs.entities.BaseResponse; import org.mmga.clubs.entities.user.User; import org.mmga.clubs.entities.user.UserLoginVo; @@ -33,4 +34,9 @@ public class UserController { public BaseResponse createUser(@RequestBody UserRegVo user, HttpServletResponse response){ return service.createUser(user, response); } + @GetMapping("/test") + @AuthorizationRequired + public BaseResponse test(){ + return BaseResponse.success(true); + } } diff --git a/src/main/java/org/mmga/clubs/service/UserService.java b/src/main/java/org/mmga/clubs/service/UserService.java index c3373e4..f2d5c8c 100644 --- a/src/main/java/org/mmga/clubs/service/UserService.java +++ b/src/main/java/org/mmga/clubs/service/UserService.java @@ -44,6 +44,9 @@ public class UserService { } return BaseResponse.success(newUser); } + public User getUserById(int id){ + return packageUser(userDao.getUserById(id)); + } private User packageUser(UserVo vo) { if (vo == null){ return null; diff --git a/src/main/java/org/mmga/clubs/utils/JwtUtils.java b/src/main/java/org/mmga/clubs/utils/JwtUtils.java index b085014..8d81282 100644 --- a/src/main/java/org/mmga/clubs/utils/JwtUtils.java +++ b/src/main/java/org/mmga/clubs/utils/JwtUtils.java @@ -2,8 +2,11 @@ package org.mmga.clubs.utils; import com.auth0.jwt.JWT; import com.auth0.jwt.algorithms.Algorithm; +import com.auth0.jwt.exceptions.JWTVerificationException; +import com.auth0.jwt.interfaces.DecodedJWT; import lombok.extern.slf4j.Slf4j; import org.mmga.clubs.entities.user.User; +import org.mmga.clubs.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -25,4 +28,8 @@ public class JwtUtils { log.debug("对用户:{},生成JWT:{}", user.getName(), jwt); return jwt; } + public Integer verifyToken(String token) throws JWTVerificationException { + DecodedJWT verify = JWT.require(Algorithm.ECDSA512(ecPublicKey, ecPrivateKey)).build().verify(token); + return verify.getClaim("uid").asInt(); + } }