模块化拆分

This commit is contained in:
禾几海
2021-10-01 01:08:46 +08:00
parent c1c7f38ee9
commit 7e700b6499
69 changed files with 471 additions and 331 deletions

View File

@@ -29,5 +29,26 @@
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0.1</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,12 @@
package cn.celess.user;
import cn.celess.common.CommonApplication;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(scanBasePackageClasses = {UserApplication.class, CommonApplication.class})
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}

View File

@@ -0,0 +1,25 @@
package cn.celess.user.config;
import cn.celess.user.filter.AuthenticationFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @Author: 小海
* @Date: 2019/10/18 14:19
* @Description:
*/
@Configuration
public class AuthorizationInterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authenticationFilter()).addPathPatterns("/**");
}
@Bean
public AuthenticationFilter authenticationFilter() {
return new AuthenticationFilter();
}
}

View File

@@ -0,0 +1,94 @@
package cn.celess.user.filter;
import cn.celess.common.enmu.ResponseEnum;
import cn.celess.common.entity.Response;
import cn.celess.common.service.UserService;
import cn.celess.common.util.RedisUtil;
import cn.celess.user.util.JwtUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Author: 小海
* @Date: 2019/11/16 11:21
* @Description: 鉴权拦截器
*/
public class AuthenticationFilter implements HandlerInterceptor {
private static final Logger logger = LoggerFactory.getLogger(AuthenticationFilter.class);
private static final String USER_PREFIX = "/user";
private static final String ADMIN_PREFIX = "/admin";
private static final String ROLE_ADMIN = "admin";
private static final String ROLE_USER = "user";
@Autowired
JwtUtil jwtUtil;
@Autowired
RedisUtil redisUtil;
@Autowired
UserService userService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String path = request.getRequestURI();
path = path.replaceAll("/+", "/");
int indexOf = path.indexOf("/", 1);
String rootPath = indexOf == -1 ? path : path.substring(0, indexOf);
String jwtStr = request.getHeader("Authorization");
if (jwtStr != null && !jwtStr.isEmpty() && !jwtUtil.isTokenExpired(jwtStr)) {
// 已登录 记录当前email
request.getSession().setAttribute("email", jwtUtil.getUsernameFromToken(jwtStr));
}
// 不需要鉴权的路径
if (!USER_PREFIX.equalsIgnoreCase(rootPath) && !ADMIN_PREFIX.equalsIgnoreCase(rootPath)) {
return true;
}
if (jwtStr == null || jwtStr.isEmpty()) {
return writeResponse(ResponseEnum.HAVE_NOT_LOG_IN, response, request);
}
if (jwtUtil.isTokenExpired(jwtStr)) {
return writeResponse(ResponseEnum.LOGIN_EXPIRED, response, request);
}
String email = jwtUtil.getUsernameFromToken(jwtStr);
if (jwtUtil.isTokenExpired(jwtStr)) {
// 登陆过期
return writeResponse(ResponseEnum.LOGIN_EXPIRED, response, request);
}
if (!redisUtil.hasKey(email + "-login")) {
return writeResponse(ResponseEnum.LOGOUT, response, request);
}
String role = userService.getUserRoleByEmail(email);
if (role.equals(ROLE_USER) || role.equals(ROLE_ADMIN)) {
// 更新token
String token = jwtUtil.updateTokenDate(jwtStr);
response.setHeader("Authorization", token);
}
if (role.equals(ROLE_ADMIN)) {
// admin
return true;
}
if (role.equals(ROLE_USER) && !rootPath.equals(ADMIN_PREFIX)) {
// user not admin page
return true;
}
return writeResponse(ResponseEnum.PERMISSION_ERROR, response, request);
}
private boolean writeResponse(ResponseEnum e, HttpServletResponse response, HttpServletRequest request) {
response.setHeader("Content-Type", "application/json;charset=UTF-8");
try {
logger.info("鉴权失败,[code:{},msg:{},path:{}]", e.getCode(), e.getMsg(), request.getRequestURI() + "?" + request.getQueryString());
response.getWriter().println(new ObjectMapper().writeValueAsString(Response.response(e, null)));
} catch (IOException ex) {
ex.printStackTrace();
}
return false;
}
}

View File

@@ -0,0 +1,11 @@
package cn.celess.user;
import cn.celess.common.test.BaseTest;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public abstract class UserBaseTest extends BaseTest {
}

View File

@@ -0,0 +1,277 @@
package cn.celess.user.controller;
import cn.celess.common.entity.Response;
import cn.celess.common.entity.User;
import cn.celess.common.entity.dto.LoginReq;
import cn.celess.common.entity.dto.UserReq;
import cn.celess.common.entity.vo.PageData;
import cn.celess.common.entity.vo.UserModel;
import cn.celess.common.mapper.UserMapper;
import cn.celess.common.service.UserService;
import cn.celess.common.util.MD5Util;
import cn.celess.common.util.RedisUtil;
import cn.celess.user.UserBaseTest;
import com.fasterxml.jackson.core.type.TypeReference;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import static cn.celess.common.enmu.ResponseEnum.*;
import static org.junit.Assert.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
public class UserControllerTest extends UserBaseTest {
@Autowired
UserMapper userMapper;
@Autowired
RedisUtil redisUtil;
private static final TypeReference<?> USER_MODEL_TYPE = new TypeReference<Response<UserModel>>() {
};
private static final TypeReference<?> USER_MODEL_PAGE_TYPE = new TypeReference<Response<PageData<UserModel>>>() {
};
private static final TypeReference<?> USER_MODEL_LIST_TYPE = new TypeReference<Response<List<Map<String, Object>>>>() {
};
@Autowired
UserService userService;
@Test
public void login() throws Exception {
assertNotNull(userLogin());
assertNotNull(adminLogin());
// 用户不存在
LoginReq req = new LoginReq();
req.setEmail("zh@celess.cn");
req.setPassword("123456789");
req.setIsRememberMe(false);
getMockData(post("/login"), null, req).andDo(result -> assertEquals(USER_NOT_EXIST.getCode(), getResponse(result, STRING_TYPE).getCode()));
}
@Test
public void registration() {
// ignore
}
@Test
public void logout() throws Exception {
getMockData(get("/logout")).andDo(result -> assertEquals(SUCCESS.getCode(), getResponse(result, STRING_TYPE).getCode()));
getMockData(get("/logout"), adminLogin()).andDo(result -> assertEquals(SUCCESS.getCode(), getResponse(result).getCode()));
}
@Test
public void updateInfo() throws Exception {
String desc = randomStr(4);
String disPlayName = randomStr(4);
getMockData(put("/user/userInfo/update?desc=" + desc + "&displayName=" + disPlayName), userLogin()).andDo(result -> {
Response<UserModel> response = getResponse(result, USER_MODEL_TYPE);
assertEquals(SUCCESS.getCode(), response.getCode());
UserModel u = response.getResult();
assertEquals(desc, u.getDesc());
assertEquals(disPlayName, u.getDisplayName());
assertNotNull(u.getId());
});
}
@Test
public void getUserInfo() throws Exception {
getMockData(get("/user/userInfo"), adminLogin()).andDo(result -> {
Response<UserModel> response = getResponse(result, USER_MODEL_TYPE);
assertEquals(SUCCESS.getCode(), response.getCode());
UserModel u = response.getResult();
assertNotNull(u.getId());
assertNotNull(u.getEmail());
assertNotNull(u.getDisplayName());
assertNotNull(u.getEmailStatus());
assertNotNull(u.getAvatarImgUrl());
assertNotNull(u.getDesc());
assertNotNull(u.getRecentlyLandedDate());
assertNotNull(u.getRole());
});
}
@Test
public void upload() throws Exception {
URL url = new URL("https://56462271.oss-cn-beijing.aliyuncs.com/web/logo.png");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
InputStream inputStream = connection.getInputStream();
assertNotNull(inputStream);
// mock 实现类
mockInjectInstance(userService, "qiniuService", new TestQiNiuServiceImpl());
MockMultipartFile file = new MockMultipartFile("file", "logo.png", MediaType.IMAGE_PNG_VALUE, inputStream);
getMockData(multipart("/user/imgUpload").file(file), userLogin()).andDo(result -> {
Response<Object> response = getResponse(result, OBJECT_TYPE);
assertEquals(SUCCESS.getCode(), response.getCode());
assertNotNull(response.getResult());
});
}
@Test
public void sendResetPwdEmail() {
// ignore
}
@Test
public void sendVerifyEmail() {
// ignore
}
@Test
public void emailVerify() throws Exception {
String email = randomStr(4) + "@celess.cn";
String pwd = MD5Util.getMD5("123456789");
userMapper.addUser(new User(email, pwd));
String verifyId = randomStr();
LoginReq req = new LoginReq(email, "123456789", true);
redisUtil.setEx(email + "-verify", verifyId, 2, TimeUnit.DAYS);
getMockData(post("/emailVerify").param("verifyId", verifyId).param("email", email), login(req)).andDo(result ->
assertEquals(SUCCESS.getCode(), getResponse(result, OBJECT_TYPE).getCode())
);
}
@Test
public void resetPwd() throws Exception {
String email = randomStr(4) + "@celess.cn";
String pwd = MD5Util.getMD5("1234567890");
userMapper.addUser(new User(email, pwd));
LoginReq req = new LoginReq(email, "1234567890", true);
String verifyId = randomStr();
// 设置验证id
redisUtil.setEx(email + "-resetPwd", verifyId, 2, TimeUnit.DAYS);
MockHttpServletRequestBuilder resetPwd = post("/resetPwd").param("verifyId", verifyId).param("email", email).param("pwd", "123456789");
// 未验证
getMockData(resetPwd, login(req)).andDo(result -> assertEquals(USEREMAIL_NOT_VERIFY.getCode(), getResponse(result, OBJECT_TYPE).getCode()));
// 设置未验证
userMapper.updateEmailStatus(email, true);
// 正常
getMockData(resetPwd, login(req)).andDo(result -> assertEquals(SUCCESS.getCode(), getResponse(result, OBJECT_TYPE).getCode()));
}
@Test
public void multipleDelete() throws Exception {
List<User> userList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
String s = randomStr();
String email = s.substring(s.length() - 4) + "@celess.cn";
String pwd = MD5Util.getMD5("123456789");
User user = new User(email, pwd);
int i1 = userMapper.addUser(user);
if (i1 == 0) {
continue;
}
userList.add(userMapper.findByEmail(email));
if (i == 9) {
//设置一个管理员
userMapper.setUserRole(userMapper.findByEmail(email).getId(), "admin");
}
}
List<Integer> idList = userList.stream().map(user -> user.getId().intValue()).collect(Collectors.toList());
getMockData(delete("/admin/user/delete"), adminLogin(), idList).andDo(result -> {
Response<List<Map<String, Object>>> response = getResponse(result, USER_MODEL_LIST_TYPE);
assertEquals(SUCCESS.getCode(), response.getCode());
response.getResult().forEach(o -> {
// 判断响应数据中是否包含输入的id
assertTrue(idList.contains((int) o.get("id")));
// 判断处理状态
boolean status = (boolean) o.get("status");
if (o.containsKey("msg"))
assertFalse(status);
else
assertTrue(status);
});
});
}
@Test
public void updateInfoByAdmin() throws Exception {
UserReq userReq = new UserReq();
String email = randomStr(4) + "@celess.cn";
User user = new User(email, MD5Util.getMD5("123456789"));
userMapper.addUser(user);
User userByDb = userMapper.findByEmail(email);
userReq.setId(userByDb.getId());
userReq.setPwd(randomStr().substring(0, 10));
userReq.setDesc(randomStr());
userReq.setEmailStatus(new Random().nextBoolean());
userReq.setRole("admin");
userReq.setDisplayName(randomStr(4));
userReq.setEmail(randomStr(5) + "@celess.cn");
getMockData(put("/admin/user"), adminLogin(), userReq).andDo(result -> {
Response<UserModel> response = getResponse(result, USER_MODEL_TYPE);
assertEquals(SUCCESS.getCode(), response.getCode());
UserModel userModel = response.getResult();
assertEquals(userReq.getId(), userModel.getId());
assertEquals(userReq.getRole(), userModel.getRole());
assertEquals(userReq.getEmail(), userModel.getEmail());
assertEquals(userReq.getDesc(), userModel.getDesc());
assertEquals(userReq.getDisplayName(), userModel.getDisplayName());
});
}
@Test
public void getAllUser() throws Exception {
getMockData(get("/admin/users?page=1&count=10"), adminLogin()).andDo(result -> {
Response<PageData<UserModel>> response = getResponse(result, USER_MODEL_PAGE_TYPE);
assertEquals(SUCCESS.getCode(), response.getCode());
// 结果集非空
assertNotNull(response.getResult());
// 判断pageInfo是否包装完全
PageData<UserModel> pageData = response.getResult();
assertNotEquals(0, pageData.getTotal());
assertEquals(1, pageData.getPageNum());
assertEquals(10, pageData.getPageSize());
// 内容完整
for (UserModel u : pageData.getList()) {
assertNotNull(u.getId());
assertNotNull(u.getEmail());
assertNotNull(u.getRole());
assertNotNull(u.getEmailStatus());
assertNotNull(u.getDisplayName());
}
});
}
@Test
public void getEmailStatus() throws Exception {
String email = randomStr(4) + "@celess.cn";
getMockData(get("/emailStatus/" + email)).andDo(result -> assertFalse((Boolean) getResponse(result, BOOLEAN_TYPE).getResult()));
getMockData(get("/emailStatus/" + ADMIN_EMAIL)).andDo(result -> assertTrue((Boolean) getResponse(result, BOOLEAN_TYPE).getResult()));
}
@Test
public void setPwd() throws Exception {
String email = randomStr(4) + "@celess.cn";
assertEquals(1, userMapper.addUser(new User(email, MD5Util.getMD5("1234567890"))));
LoginReq req = new LoginReq(email, "1234567890", false);
String token = login(req);
assertNotNull(token);
MultiValueMap<String, String> param = new LinkedMultiValueMap<String, String>();
param.add("pwd", "1234567890");
param.add("newPwd", "aaabbbccc");
param.add("confirmPwd", "aaabbbccc");
getMockData(post("/user/setPwd").params(param), token).andDo(result -> {
assertEquals(SUCCESS.getCode(), getResponse(result).getCode());
assertEquals(MD5Util.getMD5("aaabbbccc"), userMapper.getPwd(email));
});
}
}

View File

@@ -0,0 +1,53 @@
package cn.celess.user.filter;
import cn.celess.common.entity.Response;
import cn.celess.user.UserBaseTest;
import org.junit.Test;
import static cn.celess.common.enmu.ResponseEnum.*;
import static org.junit.Assert.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
/**
* @Author: 小海
* @Date: 2019/11/28 16:05
* @Description: 授权拦截器的测试类
*/
public class AuthorizationFilter extends UserBaseTest {
@Test
public void UserAccess() throws Exception {
// 未登录
getMockData(get("/user/userInfo")).andDo(result -> assertEquals(HAVE_NOT_LOG_IN.getCode(), getResponse(result).getCode()));
// user权限登录
getMockData(get("/user/userInfo"), userLogin()).andDo(result -> assertEquals(SUCCESS.getCode(), getResponse(result).getCode()));
}
@Test
public void AdminAccess() throws Exception {
// 未登录
getMockData(get("/admin/articles?page=1&count=1")).andDo(result -> assertEquals(HAVE_NOT_LOG_IN.getCode(), getResponse(result).getCode()));
// user权限
getMockData(get("/admin/articles?page=1&count=1"), userLogin()).andDo(result -> assertEquals(PERMISSION_ERROR.getCode(), getResponse(result).getCode()));
// admin 权限
getMockData(get("/admin/articles?page=1&count=1"), adminLogin()).andDo(result -> assertEquals(SUCCESS.getCode(), getResponse(result).getCode()));
}
@Test
public void VisitorAccess() throws Exception {
getMockData(get("/user/userInfo")).andDo(result -> assertEquals(HAVE_NOT_LOG_IN.getCode(), getResponse(result).getCode()));
getMockData(get("/admin/articles?page=1&count=1")).andDo(result -> assertEquals(HAVE_NOT_LOG_IN.getCode(), getResponse(result).getCode()));
}
@Test
public void authorizationTest() throws Exception {
// 测试response中有无Authorization字段
String token = userLogin();
getMockData(get("/user/userInfo"), token).andDo(result -> {
Response<Object> response = getResponse(result);
assertEquals(SUCCESS.getCode(), response.getCode());
assertNotNull(result.getResponse().getHeader("Authorization"));
assertNotEquals(token, result.getResponse().getHeader("Authorization"));
});
}
}

View File

@@ -0,0 +1,74 @@
package cn.celess.user.serviceimpl;
import cn.celess.common.enmu.ResponseEnum;
import cn.celess.common.enmu.UserAccountStatusEnum;
import cn.celess.common.entity.User;
import cn.celess.common.entity.dto.LoginReq;
import cn.celess.common.entity.vo.PageData;
import cn.celess.common.entity.vo.UserModel;
import cn.celess.common.exception.MyException;
import cn.celess.common.mapper.UserMapper;
import cn.celess.common.service.UserService;
import cn.celess.common.util.MD5Util;
import cn.celess.user.UserBaseTest;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import static org.junit.Assert.*;
public class UserServiceTest extends UserBaseTest {
@Autowired
UserService userService;
@Autowired
UserMapper userMapper;
@Test
public void getUserList() {
// 测试status 参数
PageData<UserModel> userList = userService.getUserList(1, 10, UserAccountStatusEnum.NORMAL.getCode());
assertTrue(userList.getList().stream().allMatch(userModel -> userModel.getStatus().getCode() == UserAccountStatusEnum.NORMAL.getCode()));
userList = userService.getUserList(1, 10, UserAccountStatusEnum.LOCKED.getCode());
assertTrue(userList.getList().stream().allMatch(userModel -> userModel.getStatus().getCode() == UserAccountStatusEnum.LOCKED.getCode()));
userList = userService.getUserList(1, 10, UserAccountStatusEnum.DELETED.getCode());
assertTrue(userList.getList().stream().allMatch(userModel -> userModel.getStatus().getCode() == UserAccountStatusEnum.DELETED.getCode()));
userList = userService.getUserList(1, 10, null);
assertTrue(userList.getList().stream().anyMatch(userModel -> userModel.getStatus().getCode() == UserAccountStatusEnum.NORMAL.getCode()));
assertTrue(userList.getList().stream().anyMatch(userModel -> userModel.getStatus().getCode() == UserAccountStatusEnum.LOCKED.getCode()));
assertTrue(userList.getList().stream().anyMatch(userModel -> userModel.getStatus().getCode() == UserAccountStatusEnum.DELETED.getCode()));
}
@Test
public void testLogin() {
// 测试账户 被锁 被删除 登录
String email = randomStr(5) + "@celess.cn";
String pwd = MD5Util.getMD5("123456789");
User user = new User(email, pwd);
userMapper.addUser(user);
assertNotNull(user.getId());
user = userMapper.findByEmail(email);
LoginReq loginReq = new LoginReq(email, "123456789", false);
UserModel login = userService.login(loginReq);
assertEquals(UserAccountStatusEnum.NORMAL, login.getStatus());
userMapper.lock(user.getId());
try {
userService.login(loginReq);
fail("测试登录被锁账户 失败!");
} catch (MyException e) {
assertEquals(ResponseEnum.CAN_NOT_USE.getCode(), e.getCode());
assertEquals(UserAccountStatusEnum.LOCKED, e.getResult());
}
userMapper.delete(user.getId());
try {
userService.login(loginReq);
fail("测试登录被删除账户 失败!");
} catch (MyException e) {
assertEquals(ResponseEnum.CAN_NOT_USE.getCode(), e.getCode());
assertEquals(UserAccountStatusEnum.DELETED, e.getResult());
}
}
}

View File

@@ -0,0 +1,80 @@
package cn.celess.user.util;
import cn.celess.common.entity.User;
import cn.celess.user.UserBaseTest;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
import org.springframework.beans.factory.annotation.Value;
import javax.annotation.Resource;
import java.time.Instant;
import java.util.Date;
import static org.junit.Assert.*;
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class JwtUtilTest extends UserBaseTest {
@Resource
JwtUtil jwtUtil;
@Value("${jwt.secret}")
private String secret;
@Test
public void testGenerateToken() {
User user = new User();
user.setEmail("a@celess.cn");
String s = jwtUtil.generateToken(user, false);
assertNotNull(s);
String str = null;
try {
str = jwtUtil.generateToken(null, false);
} catch (Exception e) {
// ignore
}
assertNull(str);
}
@Test
public void testIsTokenExpired() throws InterruptedException {
String s = Jwts.builder()
.setClaims(null)
.setExpiration(new Date(Instant.now().toEpochMilli() + 1000))
.signWith(SignatureAlgorithm.HS512, secret)
.compact();
Thread.sleep(1010);
assertTrue(jwtUtil.isTokenExpired(s));
assertFalse(jwtUtil.isTokenExpired(jwtUtil.generateToken(new User(), false)));
}
@Test
public void testGetUsernameFromToken() {
User user = new User();
user.setEmail("a@celess.cn");
String s = jwtUtil.generateToken(user, false);
assertEquals(user.getEmail(), jwtUtil.getUsernameFromToken(s));
user.setEmail("example@celess.cn");
assertNotEquals(user.getEmail(), jwtUtil.getUsernameFromToken(s));
}
@Test
public void testGetExpirationDateFromToken() {
User user = new User();
user.setEmail("a@celess.cn");
String s = jwtUtil.generateToken(user, false);
assertNotNull(jwtUtil.getExpirationDateFromToken(s));
}
@Test
public void updateTokenDate() {
User user = new User();
user.setEmail("a@celess.cn");
String s = jwtUtil.generateToken(user, false);
Date before = jwtUtil.getExpirationDateFromToken(s);
String s1 = jwtUtil.updateTokenDate(s);
assertTrue(jwtUtil.getExpirationDateFromToken(s1).getTime() - jwtUtil.getExpirationDateFromToken(s).getTime() > 0);
}
}