This is an automated email from the ASF dual-hosted git repository.

qiaojialin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb-web-workbench.git


The following commit(s) were added to refs/heads/master by this push:
     new 23862b4  Safe Token  (#34)
23862b4 is described below

commit 23862b42341237973c5940b74bab9d5c9d9b396d
Author: ljn55966005 <[email protected]>
AuthorDate: Wed Dec 7 15:59:12 2022 +0800

    Safe Token  (#34)
---
 backend/build.gradle                               |  1 +
 backend/pom.xml                                    | 12 ++--
 .../admin/common/utils/AuthenticationUtils.java    | 17 ++++--
 .../apache/iotdb/admin/config/FilterConfig.java    |  2 +
 .../iotdb/admin/controller/UserController.java     | 35 +++--------
 .../org/apache/iotdb/admin/filter/TokenFilter.java | 31 ++++------
 .../iotdb/admin/service/impl/UserServiceImpl.java  |  2 +
 .../java/org/apache/iotdb/admin/tool/JJwtTool.java | 68 ++++++++++++++++++++++
 .../admin/controller/ConnectionControllerTest.java | 21 +++----
 .../admin/controller/IotDBControllerTest.java      | 21 +++----
 .../admin/controller/QueryControllerTest.java      | 21 +++----
 .../iotdb/admin/controller/UserControllerTest.java | 21 +++----
 12 files changed, 138 insertions(+), 114 deletions(-)

diff --git a/backend/build.gradle b/backend/build.gradle
index 8b92fc3..d3adcfd 100644
--- a/backend/build.gradle
+++ b/backend/build.gradle
@@ -58,6 +58,7 @@ exclude(module: 'protobuf-java')
     compile group: 'cn.cisdigital', name: 'exception-component', 
version:'1.0.0'
     compile group: 'com.dianping.cat', name: 'cat-client', version:'3.0.0'
     compile group: 'org.hibernate.validator', name: 'hibernate-validator', 
version:'6.0.9.Final'
+    compile group: 'io.jsonwebtoken', name: 'jjwt', version:'0.6.0'
     compile group: 'org.aspectj', name: 'aspectjweaver', version:'1.9.6'
     testCompile(group: 'org.springframework.boot', name: 
'spring-boot-starter-test', version:'2.3.3.RELEASE') {
 exclude(module: 'junit-vintage-engine')
diff --git a/backend/pom.xml b/backend/pom.xml
index e3fb378..fb5d805 100644
--- a/backend/pom.xml
+++ b/backend/pom.xml
@@ -54,6 +54,12 @@
     </dependency>
 
 
+    <dependency>
+      <groupId>io.jsonwebtoken</groupId>
+      <artifactId>jjwt</artifactId>
+      <version>0.6.0</version>
+    </dependency>
+
     <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-log4j2</artifactId>
@@ -71,11 +77,7 @@
       <version>3.34.0</version>
     </dependency>
 
-    <dependency>
-      <groupId>com.auth0</groupId>
-      <artifactId>java-jwt</artifactId>
-      <version>3.4.0</version>
-    </dependency>
+
 
     <dependency>
       <groupId>org.projectlombok</groupId>
diff --git 
a/backend/src/main/java/org/apache/iotdb/admin/common/utils/AuthenticationUtils.java
 
b/backend/src/main/java/org/apache/iotdb/admin/common/utils/AuthenticationUtils.java
index 1b2e149..9f72d56 100644
--- 
a/backend/src/main/java/org/apache/iotdb/admin/common/utils/AuthenticationUtils.java
+++ 
b/backend/src/main/java/org/apache/iotdb/admin/common/utils/AuthenticationUtils.java
@@ -21,9 +21,9 @@ package org.apache.iotdb.admin.common.utils;
 
 import org.apache.iotdb.admin.common.exception.BaseException;
 import org.apache.iotdb.admin.common.exception.ErrorCode;
+import org.apache.iotdb.admin.tool.JJwtTool;
 
-import com.auth0.jwt.JWT;
-import com.auth0.jwt.interfaces.DecodedJWT;
+import io.jsonwebtoken.Claims;
 
 import javax.servlet.http.HttpServletRequest;
 
@@ -35,15 +35,20 @@ public class AuthenticationUtils {
     if (userId == null) {
       throw new BaseException(ErrorCode.NO_USER, ErrorCode.NO_USER_MSG);
     }
-    DecodedJWT authorization = JWT.decode(request.getHeader("Authorization"));
-    Integer tokenUserId = authorization.getClaim("userId").asInt();
+    String authorization = request.getHeader("Authorization");
+    Claims claimsByToken = JJwtTool.getClaimsByToken(authorization);
+    if (null == claimsByToken) {
+      throw new BaseException(ErrorCode.TOKEN_ERR, ErrorCode.TOKEN_ERR_MSG);
+    }
+    Integer tokenUserId = claimsByToken.get("userId", Integer.class);
     if (!tokenUserId.equals(userId)) {
       throw new BaseException(ErrorCode.USER_AUTH_FAIL, 
ErrorCode.USER_AUTH_FAIL_MSG);
     }
   }
 
   public static Integer getUserId(HttpServletRequest request) {
-    DecodedJWT authentication = JWT.decode(request.getHeader("Authorization"));
-    return authentication.getClaim("userId").asInt();
+    String authorization = request.getHeader("Authorization");
+    Claims claimsByToken = JJwtTool.getClaimsByToken(authorization);
+    return claimsByToken.get("userId", Integer.class);
   }
 }
diff --git 
a/backend/src/main/java/org/apache/iotdb/admin/config/FilterConfig.java 
b/backend/src/main/java/org/apache/iotdb/admin/config/FilterConfig.java
index 6a6ed82..e935740 100644
--- a/backend/src/main/java/org/apache/iotdb/admin/config/FilterConfig.java
+++ b/backend/src/main/java/org/apache/iotdb/admin/config/FilterConfig.java
@@ -39,6 +39,8 @@ public class FilterConfig implements WebMvcConfigurer {
     List<String> paths = new ArrayList();
     paths.add("/servers/**");
     paths.add("/get");
+    paths.add("/save");
+    paths.add("/delete");
     paths.add("/downloadFile/**");
     interceptorRegistration.addPathPatterns(paths);
   }
diff --git 
a/backend/src/main/java/org/apache/iotdb/admin/controller/UserController.java 
b/backend/src/main/java/org/apache/iotdb/admin/controller/UserController.java
index b1a7f97..93adb9a 100644
--- 
a/backend/src/main/java/org/apache/iotdb/admin/controller/UserController.java
+++ 
b/backend/src/main/java/org/apache/iotdb/admin/controller/UserController.java
@@ -28,10 +28,9 @@ import org.apache.iotdb.admin.model.vo.ConnVO;
 import org.apache.iotdb.admin.model.vo.ConnectionVO;
 import org.apache.iotdb.admin.service.ConnectionService;
 import org.apache.iotdb.admin.service.UserService;
+import org.apache.iotdb.admin.tool.JJwtTool;
 
-import com.auth0.jwt.JWT;
-import com.auth0.jwt.algorithms.Algorithm;
-import com.auth0.jwt.interfaces.DecodedJWT;
+import io.jsonwebtoken.Claims;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
@@ -42,8 +41,6 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import java.net.InetAddress;
-import java.util.Calendar;
 import java.util.List;
 
 @RestController
@@ -70,7 +67,7 @@ public class UserController {
     int userId = user.getId();
     List<ConnVO> connVOs = connectionService.getAllConnections(userId);
     ConnectionVO connectionVO = new ConnectionVO(connVOs, userId, name);
-    response.addHeader("Authorization", getToken(user));
+    response.addHeader("Authorization", JJwtTool.generateToken(user));
     return BaseVO.success("Login  successful", connectionVO);
   }
 
@@ -94,11 +91,11 @@ public class UserController {
   @ApiOperation("Get information of user")
   public BaseVO<User> getUser(HttpServletRequest request) {
     String authorization = request.getHeader("Authorization");
-    DecodedJWT decode = JWT.decode(authorization);
+    Claims claimsByToken = JJwtTool.getClaimsByToken(authorization);
     User user = new User();
-    if (decode != null) {
-      Integer userId = decode.getClaim("userId").asInt();
-      String name = decode.getClaim("name").asString();
+    if (claimsByToken != null) {
+      Integer userId = claimsByToken.get("userId", Integer.class);
+      String name = claimsByToken.get("name", String.class);
       user.setId(userId);
       user.setName(name);
     }
@@ -121,22 +118,4 @@ public class UserController {
             + "</html>";
     return str;
   }
-
-  private String getToken(User user) throws BaseException {
-    Calendar instance = Calendar.getInstance();
-    try {
-      instance.add(Calendar.HOUR, 24);
-      String token =
-          JWT.create()
-              .withClaim("userId", user.getId())
-              .withClaim("name", user.getName())
-              .withExpiresAt(instance.getTime())
-              .sign(Algorithm.HMAC256("IOTDB:" + 
InetAddress.getLocalHost().getHostAddress()));
-      logger.info(user.getName() + "login successfully");
-      return token;
-    } catch (Exception e) {
-      logger.info(e.getMessage());
-      throw new BaseException(ErrorCode.GET_TOKEN_FAIL, 
ErrorCode.GET_TOKEN_FAIL_MSG);
-    }
-  }
 }
diff --git 
a/backend/src/main/java/org/apache/iotdb/admin/filter/TokenFilter.java 
b/backend/src/main/java/org/apache/iotdb/admin/filter/TokenFilter.java
index 22d1242..49b57bd 100644
--- a/backend/src/main/java/org/apache/iotdb/admin/filter/TokenFilter.java
+++ b/backend/src/main/java/org/apache/iotdb/admin/filter/TokenFilter.java
@@ -21,36 +21,29 @@ package org.apache.iotdb.admin.filter;
 
 import org.apache.iotdb.admin.common.exception.BaseException;
 import org.apache.iotdb.admin.common.exception.ErrorCode;
+import org.apache.iotdb.admin.tool.JJwtTool;
 
-import com.auth0.jwt.JWT;
-import com.auth0.jwt.JWTVerifier;
-import com.auth0.jwt.algorithms.Algorithm;
+import io.jsonwebtoken.Claims;
+import org.springframework.util.ObjectUtils;
 import org.springframework.web.servlet.HandlerInterceptor;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-
 public class TokenFilter implements HandlerInterceptor {
   @Override
   public boolean preHandle(HttpServletRequest request, HttpServletResponse 
response, Object handler)
       throws BaseException {
-    JWTVerifier jwtVerifier;
-    try {
-      jwtVerifier =
-          JWT.require(Algorithm.HMAC256("IOTDB:" + 
InetAddress.getLocalHost().getHostAddress()))
-              .build();
-    } catch (UnknownHostException e) {
-      e.printStackTrace();
-      throw new BaseException(ErrorCode.SET_JWT_FAIL, 
ErrorCode.SET_JWT_FAIL_MSG);
+    String authorization = request.getHeader("Authorization");
+    if (null == authorization || "".equals(authorization)) {
+      throw new BaseException(ErrorCode.TOKEN_ERR, ErrorCode.TOKEN_ERR_MSG);
+    }
+    Claims claimsByToken = JJwtTool.getClaimsByToken(authorization);
+    if (ObjectUtils.isEmpty(claimsByToken)) {
+      throw new BaseException(ErrorCode.TOKEN_ERR, ErrorCode.TOKEN_ERR_MSG);
     }
-    try {
-      String authorization = request.getHeader("Authorization");
-      jwtVerifier.verify(authorization);
-    } catch (Exception e) {
-      e.printStackTrace();
+    Integer userId = claimsByToken.get("userId", Integer.class);
+    if (null == userId) {
       throw new BaseException(ErrorCode.TOKEN_ERR, ErrorCode.TOKEN_ERR_MSG);
     }
     return true;
diff --git 
a/backend/src/main/java/org/apache/iotdb/admin/service/impl/UserServiceImpl.java
 
b/backend/src/main/java/org/apache/iotdb/admin/service/impl/UserServiceImpl.java
index 7b5e832..4b38f56 100644
--- 
a/backend/src/main/java/org/apache/iotdb/admin/service/impl/UserServiceImpl.java
+++ 
b/backend/src/main/java/org/apache/iotdb/admin/service/impl/UserServiceImpl.java
@@ -27,11 +27,13 @@ import org.apache.iotdb.admin.service.UserService;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
 
 @Service
+@Slf4j
 public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements 
UserService {
 
   @Autowired private UserMapper userMapper;
diff --git a/backend/src/main/java/org/apache/iotdb/admin/tool/JJwtTool.java 
b/backend/src/main/java/org/apache/iotdb/admin/tool/JJwtTool.java
new file mode 100644
index 0000000..8804107
--- /dev/null
+++ b/backend/src/main/java/org/apache/iotdb/admin/tool/JJwtTool.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.admin.tool;
+
+import org.apache.iotdb.admin.model.entity.User;
+
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Date;
+
+/** date:2022/12/6 author:yzf project_name:backend */
+@Slf4j
+public class JJwtTool {
+  private static String secret =
+      
"HSyJ0eXAiOiJKV1QasdfffffffSd3g8923402347523fffasdfasgwaegwaegawegawegawegawetwgewagagew"
+          + 
"asdf23r23DEEasdfawef134t2fawt2g325gafasdfasdfiLCJhbGciOiJIUzI1NiJ9";
+
+  public static String generateToken(User user) {
+    log.info("user=" + user.toString());
+    Date now = new Date();
+    //    Calendar instance = Calendar.getInstance();
+    //    instance.add(Calendar.HOUR_OF_DAY, 24);
+    Date expireDate = new Date(new Date().getTime() + (1000 * 60 * 60 * 10));
+    return Jwts.builder()
+        .setHeaderParam("type", "JWT")
+        .setSubject(user.getId() + "")
+        .setIssuedAt(now) // 签发时间
+        .claim("userId", user.getId())
+        .claim("name", user.getName())
+        .setExpiration(expireDate) // 过期时间
+        .signWith(SignatureAlgorithm.HS512, secret)
+        .compact();
+  }
+
+  /** 解析token */
+  public static Claims getClaimsByToken(String token) {
+    try {
+      return 
Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
+    } catch (Exception e) {
+      System.out.println("validate is token error");
+      return null;
+    }
+  }
+
+  /** 判断 token 是否过期 */
+  public boolean isTokenExpired(Date expiration) {
+    return expiration.before(new Date());
+  }
+}
diff --git 
a/backend/src/test/java/org/apache/iotdb/admin/controller/ConnectionControllerTest.java
 
b/backend/src/test/java/org/apache/iotdb/admin/controller/ConnectionControllerTest.java
index cd9d2e8..df96ce2 100644
--- 
a/backend/src/test/java/org/apache/iotdb/admin/controller/ConnectionControllerTest.java
+++ 
b/backend/src/test/java/org/apache/iotdb/admin/controller/ConnectionControllerTest.java
@@ -19,8 +19,9 @@
 
 package org.apache.iotdb.admin.controller;
 
-import com.auth0.jwt.JWT;
-import com.auth0.jwt.algorithms.Algorithm;
+import org.apache.iotdb.admin.model.entity.User;
+import org.apache.iotdb.admin.tool.JJwtTool;
+
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
@@ -33,9 +34,6 @@ import 
org.springframework.test.web.servlet.setup.MockMvcBuilders;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.context.WebApplicationContext;
 
-import java.net.InetAddress;
-import java.util.Calendar;
-
 @SpringBootTest
 class ConnectionControllerTest {
   private MockMvc mvc;
@@ -100,16 +98,11 @@ class ConnectionControllerTest {
   }
 
   private String getToken() {
-    Calendar instance = Calendar.getInstance();
     try {
-      instance.add(Calendar.HOUR, 24);
-      String token =
-          JWT.create()
-              .withClaim("userId", 1)
-              .withClaim("name", "root")
-              .withExpiresAt(instance.getTime())
-              .sign(Algorithm.HMAC256("IOTDB:" + 
InetAddress.getLocalHost().getHostAddress()));
-      return token;
+      User user = new User();
+      user.setId(1);
+      user.setName("root");
+      return JJwtTool.generateToken(user);
     } catch (Exception e) {
       e.printStackTrace();
       return null;
diff --git 
a/backend/src/test/java/org/apache/iotdb/admin/controller/IotDBControllerTest.java
 
b/backend/src/test/java/org/apache/iotdb/admin/controller/IotDBControllerTest.java
index 2686573..c24928e 100644
--- 
a/backend/src/test/java/org/apache/iotdb/admin/controller/IotDBControllerTest.java
+++ 
b/backend/src/test/java/org/apache/iotdb/admin/controller/IotDBControllerTest.java
@@ -19,8 +19,9 @@
 
 package org.apache.iotdb.admin.controller;
 
-import com.auth0.jwt.JWT;
-import com.auth0.jwt.algorithms.Algorithm;
+import org.apache.iotdb.admin.model.entity.User;
+import org.apache.iotdb.admin.tool.JJwtTool;
+
 import org.junit.jupiter.api.MethodOrderer;
 import org.junit.jupiter.api.Order;
 import org.junit.jupiter.api.Test;
@@ -34,9 +35,6 @@ import 
org.springframework.test.web.servlet.result.MockMvcResultMatchers;
 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
 import org.springframework.web.context.WebApplicationContext;
 
-import java.net.InetAddress;
-import java.util.Calendar;
-
 @SpringBootTest
 @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
 class IotDBControllerTest {
@@ -46,16 +44,11 @@ class IotDBControllerTest {
   private String token = getToken();
 
   private String getToken() {
-    Calendar instance = Calendar.getInstance();
     try {
-      instance.add(Calendar.HOUR, 24);
-      String token =
-          JWT.create()
-              .withClaim("userId", 1)
-              .withClaim("name", "root")
-              .withExpiresAt(instance.getTime())
-              .sign(Algorithm.HMAC256("IOTDB:" + 
InetAddress.getLocalHost().getHostAddress()));
-      return token;
+      User user = new User();
+      user.setId(1);
+      user.setName("root");
+      return JJwtTool.generateToken(user);
     } catch (Exception e) {
       e.printStackTrace();
       return null;
diff --git 
a/backend/src/test/java/org/apache/iotdb/admin/controller/QueryControllerTest.java
 
b/backend/src/test/java/org/apache/iotdb/admin/controller/QueryControllerTest.java
index 7b1ba85..71e135c 100644
--- 
a/backend/src/test/java/org/apache/iotdb/admin/controller/QueryControllerTest.java
+++ 
b/backend/src/test/java/org/apache/iotdb/admin/controller/QueryControllerTest.java
@@ -19,8 +19,9 @@
 
 package org.apache.iotdb.admin.controller;
 
-import com.auth0.jwt.JWT;
-import com.auth0.jwt.algorithms.Algorithm;
+import org.apache.iotdb.admin.model.entity.User;
+import org.apache.iotdb.admin.tool.JJwtTool;
+
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
@@ -33,9 +34,6 @@ import 
org.springframework.test.web.servlet.setup.MockMvcBuilders;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.context.WebApplicationContext;
 
-import java.net.InetAddress;
-import java.util.Calendar;
-
 @SpringBootTest
 class QueryControllerTest {
 
@@ -116,16 +114,11 @@ class QueryControllerTest {
   }
 
   private String getToken() {
-    Calendar instance = Calendar.getInstance();
     try {
-      instance.add(Calendar.HOUR, 24);
-      String token =
-          JWT.create()
-              .withClaim("userId", 1)
-              .withClaim("name", "root")
-              .withExpiresAt(instance.getTime())
-              .sign(Algorithm.HMAC256("IOTDB:" + 
InetAddress.getLocalHost().getHostAddress()));
-      return token;
+      User user = new User();
+      user.setId(1);
+      user.setName("root");
+      return JJwtTool.generateToken(user);
     } catch (Exception e) {
       e.printStackTrace();
       return null;
diff --git 
a/backend/src/test/java/org/apache/iotdb/admin/controller/UserControllerTest.java
 
b/backend/src/test/java/org/apache/iotdb/admin/controller/UserControllerTest.java
index 574aa0c..e2f927a 100644
--- 
a/backend/src/test/java/org/apache/iotdb/admin/controller/UserControllerTest.java
+++ 
b/backend/src/test/java/org/apache/iotdb/admin/controller/UserControllerTest.java
@@ -19,8 +19,9 @@
 
 package org.apache.iotdb.admin.controller;
 
-import com.auth0.jwt.JWT;
-import com.auth0.jwt.algorithms.Algorithm;
+import org.apache.iotdb.admin.model.entity.User;
+import org.apache.iotdb.admin.tool.JJwtTool;
+
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
@@ -31,9 +32,6 @@ import 
org.springframework.test.web.servlet.result.MockMvcResultMatchers;
 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
 import org.springframework.web.context.WebApplicationContext;
 
-import java.net.InetAddress;
-import java.util.Calendar;
-
 @SpringBootTest
 class UserControllerTest {
 
@@ -65,16 +63,11 @@ class UserControllerTest {
   }
 
   private String getToken() {
-    Calendar instance = Calendar.getInstance();
     try {
-      instance.add(Calendar.HOUR, 24);
-      String token =
-          JWT.create()
-              .withClaim("userId", 1)
-              .withClaim("name", "root")
-              .withExpiresAt(instance.getTime())
-              .sign(Algorithm.HMAC256("IOTDB:" + 
InetAddress.getLocalHost().getHostAddress()));
-      return token;
+      User user = new User();
+      user.setId(1);
+      user.setName("root");
+      return JJwtTool.generateToken(user);
     } catch (Exception e) {
       e.printStackTrace();
       return null;

Reply via email to