模块化拆分
This commit is contained in:
@@ -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>
|
||||
12
blog-user/src/main/java/cn/celess/user/UserApplication.java
Normal file
12
blog-user/src/main/java/cn/celess/user/UserApplication.java
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
11
blog-user/src/test/java/cn/celess/user/UserBaseTest.java
Normal file
11
blog-user/src/test/java/cn/celess/user/UserBaseTest.java
Normal 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 {
|
||||
}
|
||||
@@ -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));
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -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"));
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
80
blog-user/src/test/java/cn/celess/user/util/JwtUtilTest.java
Normal file
80
blog-user/src/test/java/cn/celess/user/util/JwtUtilTest.java
Normal 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user