yangfeng il y a 1 an
Parent
commit
38ea41148b

+ 232 - 191
core/src/main/java/org/jeecg/common/system/util/JwtUtil.java

@@ -1,6 +1,7 @@
 package org.jeecg.common.system.util;
 
 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.exceptions.JWTDecodeException;
@@ -11,6 +12,7 @@ import com.google.common.base.Joiner;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.util.Date;
+import java.util.Map;
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -36,27 +38,28 @@ import org.jeecg.common.util.oConvertUtils;
  **/
 public class JwtUtil {
 
-	/**Token有效期为7天(Token在reids中缓存时间为两倍)*/
-	public static final long EXPIRE_TIME = (7 * 12) * 60 * 60 * 1000;
-	static final String WELL_NUMBER = SymbolConstant.WELL_NUMBER + SymbolConstant.LEFT_CURLY_BRACKET;
+    /**
+     * Token有效期为7天(Token在reids中缓存时间为两倍)
+     */
+    public static final long EXPIRE_TIME = (7 * 12) * 60 * 60 * 1000;
+    static final String WELL_NUMBER = SymbolConstant.WELL_NUMBER + SymbolConstant.LEFT_CURLY_BRACKET;
 
     /**
-     *
      * @param response
      * @param code
      * @param errorMsg
      */
     public static void responseError(ServletResponse response, Integer code, String errorMsg) {
-		HttpServletResponse httpServletResponse = (HttpServletResponse) response;
-		// issues/I4YH95浏览器显示乱码问题
-		httpServletResponse.setHeader("Content-type", "text/html;charset=UTF-8");
+        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
+        // issues/I4YH95浏览器显示乱码问题
+        httpServletResponse.setHeader("Content-type", "text/html;charset=UTF-8");
         Result jsonResult = new Result(code, errorMsg);
-		jsonResult.setSuccess(false);
+        jsonResult.setSuccess(false);
         OutputStream os = null;
         try {
             os = httpServletResponse.getOutputStream();
-			httpServletResponse.setCharacterEncoding("UTF-8");
-			httpServletResponse.setStatus(code);
+            httpServletResponse.setCharacterEncoding("UTF-8");
+            httpServletResponse.setStatus(code);
             os.write(new ObjectMapper().writeValueAsString(jsonResult).getBytes("UTF-8"));
             os.flush();
             os.close();
@@ -65,186 +68,224 @@ public class JwtUtil {
         }
     }
 
-	/**
-	 * 校验token是否正确
-	 *
-	 * @param token  密钥
-	 * @param secret 用户的密码
-	 * @return 是否正确
-	 */
-	public static boolean verify(String token, String username, String secret) {
-		try {
-			// 根据密码生成JWT效验器
-			Algorithm algorithm = Algorithm.HMAC256(secret);
-			JWTVerifier verifier = JWT.require(algorithm).withClaim("username", username).build();
-			// 效验TOKEN
-			DecodedJWT jwt = verifier.verify(token);
-			return true;
-		} catch (Exception exception) {
-			return false;
-		}
-	}
-
-	/**
-	 * 获得token中的信息无需secret解密也能获得
-	 *
-	 * @return token中包含的用户名
-	 */
-	public static String getUsername(String token) {
-		try {
-			DecodedJWT jwt = JWT.decode(token);
-			return jwt.getClaim("username").asString();
-		} catch (JWTDecodeException e) {
-			return null;
-		}
-	}
-
-	/**
-	 * 生成签名,5min后过期
-	 *
-	 * @param username 用户名
-	 * @param secret   用户的密码
-	 * @return 加密的token
-	 */
-	public static String sign(String username, String secret) {
-		Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
-		Algorithm algorithm = Algorithm.HMAC256(secret);
-		// 附带username信息
-		return JWT.create().withClaim("username", username).withExpiresAt(date).sign(algorithm);
-
-	}
-
-	/**
-	 * 根据request中的token获取用户账号
-	 * 
-	 * @param request
-	 * @return
-	 * @throws JeecgBootException
-	 */
-	public static String getUserNameByToken(HttpServletRequest request) throws JeecgBootException {
-		String accessToken = request.getHeader("X-Access-Token");
-		String username = getUsername(accessToken);
-		if (oConvertUtils.isEmpty(username)) {
-			throw new JeecgBootException("未获取到用户");
-		}
-		return username;
-	}
-	
-	/**
-	  *  从session中获取变量
-	 * @param key
-	 * @return
-	 */
-	public static String getSessionData(String key) {
-		//${myVar}%
-		//得到${} 后面的值
-		String moshi = "";
-		String wellNumber = WELL_NUMBER;
-
-		if(key.indexOf(SymbolConstant.RIGHT_CURLY_BRACKET)!=-1){
-			 moshi = key.substring(key.indexOf("}")+1);
-		}
-		String returnValue = null;
-		if (key.contains(wellNumber)) {
-			key = key.substring(2,key.indexOf("}"));
-		}
-		if (oConvertUtils.isNotEmpty(key)) {
-			HttpSession session = SpringContextUtils.getHttpServletRequest().getSession();
-			returnValue = (String) session.getAttribute(key);
-		}
-		//结果加上${} 后面的值
-		if(returnValue!=null){returnValue = returnValue + moshi;}
-		return returnValue;
-	}
-	
-	/**
-	  * 从当前用户中获取变量
-	 * @param key
-	 * @param user
-	 * @return
-	 */
-	public static String getUserSystemData(String key,SysUserCacheInfo user) {
-		if(user==null) {
-			user = JeecgDataAutorUtils.loadUserInfo();
-		}
-		//#{sys_user_code}%
-		
-		// 获取登录用户信息
-		LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-		
-		String moshi = "";
+    /**
+     * 校验token是否正确
+     *
+     * @param token  密钥
+     * @param secret 用户的密码
+     * @return 是否正确
+     */
+    public static boolean verify(String token, String username, String secret) {
+        try {
+            // 根据密码生成JWT效验器
+            Algorithm algorithm = Algorithm.HMAC256(secret);
+            JWTVerifier verifier = JWT.require(algorithm).withClaim("username", username).build();
+            // 效验TOKEN
+            DecodedJWT jwt = verifier.verify(token);
+            return true;
+        } catch (Exception exception) {
+            return false;
+        }
+    }
+
+    /**
+     * 获得token中的信息无需secret解密也能获得
+     *
+     * @return token中包含的用户名
+     */
+    public static String getUsername(String token) {
+        try {
+            DecodedJWT jwt = JWT.decode(token);
+            return jwt.getClaim("username").asString();
+        } catch (JWTDecodeException e) {
+            return null;
+        }
+    }
+
+    /**
+     * 生成签名,5min后过期
+     *
+     * @param username 用户名
+     * @param secret   用户的密码
+     * @return 加密的token
+     */
+    public static String sign(String username, String secret) {
+        Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
+        Algorithm algorithm = Algorithm.HMAC256(secret);
+        // 附带username信息
+        return JWT.create().withClaim("username", username).withExpiresAt(date).sign(algorithm);
+
+    }
+
+    /**
+     * 生成签名,5min后过期
+     *
+     * @param fields 字段名/值MAP
+     * @return 加密的token
+     */
+    public static String sign(Map<String, Object> fields, String secret) {
+        try {
+            Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
+            Algorithm algorithm = Algorithm.HMAC256(secret);
+            JWTCreator.Builder builder = JWT.create();
+            for (Map.Entry entry : fields.entrySet()) {
+                builder.withClaim(entry.getKey().toString(), entry.getValue().toString());
+            }
+            return builder.withExpiresAt(date).sign(algorithm);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    /**
+     * 根据request中的token获取用户账号
+     *
+     * @param request
+     * @return
+     * @throws JeecgBootException
+     */
+    public static String getUserNameByToken(HttpServletRequest request) throws JeecgBootException {
+        String accessToken = request.getHeader("X-Access-Token");
+        String username = getUsername(accessToken);
+        if (oConvertUtils.isEmpty(username)) {
+            throw new JeecgBootException("未获取到用户");
+        }
+        return username;
+    }
+
+    /**
+     * 从session中获取变量
+     *
+     * @param key
+     * @return
+     */
+    public static String getSessionData(String key) {
+        //${myVar}%
+        //得到${} 后面的值
+        String moshi = "";
+        String wellNumber = WELL_NUMBER;
+
+        if (key.indexOf(SymbolConstant.RIGHT_CURLY_BRACKET) != -1) {
+            moshi = key.substring(key.indexOf("}") + 1);
+        }
+        String returnValue = null;
+        if (key.contains(wellNumber)) {
+            key = key.substring(2, key.indexOf("}"));
+        }
+        if (oConvertUtils.isNotEmpty(key)) {
+            HttpSession session = SpringContextUtils.getHttpServletRequest().getSession();
+            returnValue = (String) session.getAttribute(key);
+        }
+        //结果加上${} 后面的值
+        if (returnValue != null) {
+            returnValue = returnValue + moshi;
+        }
+        return returnValue;
+    }
+
+    /**
+     * 从当前用户中获取变量
+     *
+     * @param key
+     * @param user
+     * @return
+     */
+    public static String getUserSystemData(String key, SysUserCacheInfo user) {
+        if (user == null) {
+            user = JeecgDataAutorUtils.loadUserInfo();
+        }
+        //#{sys_user_code}%
+
+        // 获取登录用户信息
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+
+        String moshi = "";
         String wellNumber = WELL_NUMBER;
-		if(key.indexOf(SymbolConstant.RIGHT_CURLY_BRACKET)!=-1){
-			 moshi = key.substring(key.indexOf("}")+1);
-		}
-		String returnValue = null;
-		//针对特殊标示处理#{sysOrgCode},判断替换
-		if (key.contains(wellNumber)) {
-			key = key.substring(2,key.indexOf("}"));
-		} else {
-			key = key;
-		}
-		//替换为系统登录用户帐号
-		if (key.equals(DataBaseConstant.SYS_USER_CODE)|| key.toLowerCase().equals(DataBaseConstant.SYS_USER_CODE_TABLE)) {
-			if(user==null) {
-				returnValue = sysUser.getUsername();
-			}else {
-				returnValue = user.getSysUserCode();
-			}
-		}
-		//替换为系统登录用户真实名字
-		else if (key.equals(DataBaseConstant.SYS_USER_NAME)|| key.toLowerCase().equals(DataBaseConstant.SYS_USER_NAME_TABLE)) {
-			if(user==null) {
-				returnValue = sysUser.getRealname();
-			}else {
-				returnValue = user.getSysUserName();
-			}
-		}
-		
-		//替换为系统用户登录所使用的机构编码
-		else if (key.equals(DataBaseConstant.SYS_ORG_CODE)|| key.toLowerCase().equals(DataBaseConstant.SYS_ORG_CODE_TABLE)) {
-			if(user==null) {
-				returnValue = sysUser.getOrgCode();
-			}else {
-				returnValue = user.getSysOrgCode();
-			}
-		}
-		//替换为系统用户所拥有的所有机构编码
-		else if (key.equals(DataBaseConstant.SYS_MULTI_ORG_CODE)|| key.toLowerCase().equals(DataBaseConstant.SYS_MULTI_ORG_CODE_TABLE)) {
-			if(user==null){
-				//TODO 暂时使用用户登录部门,存在逻辑缺陷,不是用户所拥有的部门
-				returnValue = sysUser.getOrgCode();
-			}else{
-				if(user.isOneDepart()) {
-					returnValue = user.getSysMultiOrgCode().get(0);
-				}else {
-					returnValue = Joiner.on(",").join(user.getSysMultiOrgCode());
-				}
-			}
-		}
-		//替换为当前系统时间(年月日)
-		else if (key.equals(DataBaseConstant.SYS_DATE)|| key.toLowerCase().equals(DataBaseConstant.SYS_DATE_TABLE)) {
-			returnValue = DateUtils.formatDate();
-		}
-		//替换为当前系统时间(年月日时分秒)
-		else if (key.equals(DataBaseConstant.SYS_TIME)|| key.toLowerCase().equals(DataBaseConstant.SYS_TIME_TABLE)) {
-			returnValue = DateUtils.now();
-		}
-		//流程状态默认值(默认未发起)
-		else if (key.equals(DataBaseConstant.BPM_STATUS)|| key.toLowerCase().equals(DataBaseConstant.BPM_STATUS_TABLE)) {
-			returnValue = "1";
-		}
-		//update-begin-author:taoyan date:20210330 for:多租户ID作为系统变量
-		else if (key.equals(TenantConstant.TENANT_ID) || key.toLowerCase().equals(TenantConstant.TENANT_ID_TABLE)){
-			returnValue = SpringContextUtils.getHttpServletRequest().getHeader(CommonConstant.TENANT_ID);
-		}
-		//update-end-author:taoyan date:20210330 for:多租户ID作为系统变量
-		if(returnValue!=null){returnValue = returnValue + moshi;}
-		return returnValue;
-	}
-	
-//	public static void main(String[] args) {
-//		 String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NjUzMzY1MTMsInVzZXJuYW1lIjoiYWRtaW4ifQ.xjhud_tWCNYBOg_aRlMgOdlZoWFFKB_givNElHNw3X0";
-//		 System.out.println(JwtUtil.getUsername(token));
-//	}
+        if (key.indexOf(SymbolConstant.RIGHT_CURLY_BRACKET) != -1) {
+            moshi = key.substring(key.indexOf("}") + 1);
+        }
+        String returnValue = null;
+        //针对特殊标示处理#{sysOrgCode},判断替换
+        if (key.contains(wellNumber)) {
+            key = key.substring(2, key.indexOf("}"));
+        } else {
+            key = key;
+        }
+        //替换为系统登录用户帐号
+        if (key.equals(DataBaseConstant.SYS_USER_CODE) || key.toLowerCase().equals(DataBaseConstant.SYS_USER_CODE_TABLE)) {
+            if (user == null) {
+                returnValue = sysUser.getUsername();
+            } else {
+                returnValue = user.getSysUserCode();
+            }
+        }
+        //替换为系统登录用户真实名字
+        else if (key.equals(DataBaseConstant.SYS_USER_NAME) || key.toLowerCase().equals(DataBaseConstant.SYS_USER_NAME_TABLE)) {
+            if (user == null) {
+                returnValue = sysUser.getRealname();
+            } else {
+                returnValue = user.getSysUserName();
+            }
+        }
+
+        //替换为系统用户登录所使用的机构编码
+        else if (key.equals(DataBaseConstant.SYS_ORG_CODE) || key.toLowerCase().equals(DataBaseConstant.SYS_ORG_CODE_TABLE)) {
+            if (user == null) {
+                returnValue = sysUser.getOrgCode();
+            } else {
+                returnValue = user.getSysOrgCode();
+            }
+        }
+        //替换为系统用户所拥有的所有机构编码
+        else if (key.equals(DataBaseConstant.SYS_MULTI_ORG_CODE) || key.toLowerCase().equals(DataBaseConstant.SYS_MULTI_ORG_CODE_TABLE)) {
+            if (user == null) {
+                //TODO 暂时使用用户登录部门,存在逻辑缺陷,不是用户所拥有的部门
+                returnValue = sysUser.getOrgCode();
+            } else {
+                if (user.isOneDepart()) {
+                    returnValue = user.getSysMultiOrgCode().get(0);
+                } else {
+                    returnValue = Joiner.on(",").join(user.getSysMultiOrgCode());
+                }
+            }
+        }
+        //替换为当前系统时间(年月日)
+        else if (key.equals(DataBaseConstant.SYS_DATE) || key.toLowerCase().equals(DataBaseConstant.SYS_DATE_TABLE)) {
+            returnValue = DateUtils.formatDate();
+        }
+        //替换为当前系统时间(年月日时分秒)
+        else if (key.equals(DataBaseConstant.SYS_TIME) || key.toLowerCase().equals(DataBaseConstant.SYS_TIME_TABLE)) {
+            returnValue = DateUtils.now();
+        }
+        //流程状态默认值(默认未发起)
+        else if (key.equals(DataBaseConstant.BPM_STATUS) || key.toLowerCase().equals(DataBaseConstant.BPM_STATUS_TABLE)) {
+            returnValue = "1";
+        }
+        //update-begin-author:taoyan date:20210330 for:多租户ID作为系统变量
+        else if (key.equals(TenantConstant.TENANT_ID) || key.toLowerCase().equals(TenantConstant.TENANT_ID_TABLE)) {
+            returnValue = SpringContextUtils.getHttpServletRequest().getHeader(CommonConstant.TENANT_ID);
+        }
+        //update-end-author:taoyan date:20210330 for:多租户ID作为系统变量
+        if (returnValue != null) {
+            returnValue = returnValue + moshi;
+        }
+        return returnValue;
+    }
+
+    /**
+     * 获得token中的信息无需secret解密也能获得
+     *
+     * @param token
+     * @param fieldName
+     * @return
+     */
+    public static String getFieldValue(String token, String fieldName) {
+        try {
+            DecodedJWT jwt = JWT.decode(token);
+            return jwt.getClaim(fieldName).asString();
+        } catch (JWTDecodeException e) {
+            return null;
+        }
+    }
+
 }

+ 7 - 1
web/src/main/java/com/ynfy/app/api/v1/controller/ApiAuthController.java

@@ -22,7 +22,9 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 @Api(tags = "API登录授权接口")
 @RestController
@@ -103,7 +105,11 @@ public class ApiAuthController {
         obj.put("userInfo", sysUser);
 
         //6. 生成token
-        String token = JwtUtil.sign(username, syspassword);
+        Map<String, Object> map = new HashMap();
+        map.put("username", username);
+        map.put("realname", sysUser.getRealname());
+        map.put("userId", sysUser.getId());
+        String token = JwtUtil.sign(map, syspassword);
         // 设置超时时间
         redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);
         redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME * 2 / 1000);

+ 40 - 0
web/src/main/java/com/ynfy/app/api/v1/controller/ApiBaseController.java

@@ -0,0 +1,40 @@
+package com.ynfy.app.api.v1.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedReader;
+import java.io.IOException;
+
+public class ApiBaseController {
+
+    /**
+     * 得到request对象
+     */
+    @Autowired
+    protected HttpServletRequest request;
+
+    /**
+     * 得到response对象
+     */
+    @Autowired
+    protected HttpServletResponse response;
+
+    public JSONObject getJsonRequest() {
+        JSONObject result = null;
+        StringBuilder sb = new StringBuilder();
+        try (BufferedReader reader = request.getReader()) {
+            char[] buff = new char[1024];
+            int len;
+            while ((len = reader.read(buff)) != -1) {
+                sb.append(buff, 0, len);
+            }
+            result = JSONObject.parseObject(sb.toString());
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return result;
+    }
+}

+ 7 - 13
web/src/main/java/com/ynfy/app/api/v1/controller/ApiExamController.java

@@ -3,6 +3,7 @@ package com.ynfy.app.api.v1.controller;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ynfy.app.api.v1.entity.dto.ExamDTO;
+import com.ynfy.app.api.v1.util.TokenUtil;
 import com.ynfy.buss.exam.exam.dto.ExamSubmitDTO;
 import com.ynfy.buss.exam.exam.dto.QuestionTypeCountDTO;
 import com.ynfy.buss.exam.exam.entity.Exam;
@@ -17,9 +18,7 @@ import com.ynfy.buss.exam.userexamresult.entity.UserExamResult;
 import com.ynfy.buss.exam.userexamresult.service.IUserExamResultService;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.api.vo.Result;
-import org.jeecg.common.system.vo.LoginUser;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
@@ -31,7 +30,7 @@ import java.util.Objects;
 @Slf4j
 @RestController
 @RequestMapping("/api/v1/exam")
-public class ApiExamController {
+public class ApiExamController extends ApiBaseController {
 
     @Autowired
     public IExamService examService;
@@ -80,15 +79,13 @@ public class ApiExamController {
 
     @GetMapping(value = "/createExam")
     public Result<?> createExam(@RequestParam(name = "examId") String examId) {
-        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-        return Result.ok(examService.createExam(user.getId(), examId));
+        return Result.ok(examService.createExam(TokenUtil.getUserId(TokenUtil.getToken(request)), examId));
     }
 
     @GetMapping(value = "/listExamIn")
     public Result<?> listExamIn() {
-        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
         // 校验是否有正在考试的试卷
-        UserExam userExam = userExamService.listExamIn(user.getId());
+        UserExam userExam = userExamService.listExamIn(TokenUtil.getUserId(TokenUtil.getToken(request)));
         if (!Objects.isNull(userExam)) {
             return Result.ok(userExam);
         }
@@ -180,8 +177,7 @@ public class ApiExamController {
      */
     @GetMapping(value = "/checkToLimit")
     public Result<?> checkToLimit(@RequestParam(name = "examId") String examId) {
-        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-        return Result.ok(examService.checkToLimit(user.getId(), examId));
+        return Result.ok(examService.checkToLimit(TokenUtil.getUserId(TokenUtil.getToken(request)), examId));
     }
 
     /**
@@ -192,8 +188,7 @@ public class ApiExamController {
      */
     @GetMapping(value = "/examRecordExist")
     public Result<?> examRecordExist(@RequestParam(name = "examId") String examId) {
-        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-        return Result.ok(examService.examRecordExist(user.getId(), examId));
+        return Result.ok(examService.examRecordExist(TokenUtil.getUserId(TokenUtil.getToken(request)), examId));
     }
 
     /**
@@ -204,8 +199,7 @@ public class ApiExamController {
      */
     @GetMapping(value = "/examScore")
     public Result<?> examScore(@RequestParam(name = "examId") String examId) {
-        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-        return Result.ok(userExamResultService.examScore(user.getId(), examId));
+        return Result.ok(userExamResultService.examScore(TokenUtil.getUserId(TokenUtil.getToken(request)), examId));
     }
 
 }

+ 1 - 1
web/src/main/java/com/ynfy/app/api/v1/interceptor/AuthorizationInterceptor.java

@@ -59,7 +59,7 @@ public class AuthorizationInterceptor implements HandlerInterceptor {
                 throw new JeecgBootException("用户不存在!");
             } else {
                 try {
-                    JwtUtil.verify(token, "userId", userName);
+                    JwtUtil.verify(token, userName, user.getPassword());
                 } catch (TokenExpiredException var6) {
                     throw new JeecgBootException("token失效,请重新登录");
                 } catch (Exception e) {

+ 11 - 0
web/src/main/java/com/ynfy/app/api/v1/util/TokenUtil.java

@@ -50,4 +50,15 @@ public class TokenUtil {
         return JwtUtil.getUsername(token);
     }
 
+    /**
+     * 获取用户id
+     *
+     * @param token
+     * @return
+     */
+    public static String getUserId(String token) {
+        return JwtUtil.getFieldValue(token, "userId");
+    }
+
+
 }