From 006165ca801375cefba0979fe7d03b2379f64ac8 Mon Sep 17 00:00:00 2001 From: s2042968 Date: Thu, 14 Nov 2024 19:34:19 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=99=BB=E5=BD=95=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/user/UserController.java | 11 +- domain/pom.xml | 5 + .../domain/boardservice/user/model/Token.java | 38 +++++++ .../domain/boardservice/user/model/User.java | 3 +- .../user/model/UserLoginInfo.java | 22 ++++ .../user/repository/TokenRepository.java | 13 +++ .../user/repository/UserRepository.java | 7 ++ .../user/service/TokenService.java | 23 ++++ .../user/service/UserService.java | 16 +++ .../user/service/impl/TokenServiceImpl.java | 59 +++++++++++ .../user/service/impl/UserServiceImpl.java | 24 +++++ .../boardservice/user/util/UserConstant.java | 15 +++ electromagnetic-framework/pom.xml | 8 ++ .../share/{model => result}/BaseResult.java | 5 +- .../framework/share/result/LoginResult.java | 100 ++++++++++++++++++ .../data/framework/share/sign/AESUtils.java | 29 +++++ .../share/{model => util}/BaseResultUtil.java | 4 +- .../framework/share/util/LoginResultUtil.java | 39 +++++++ .../data/manage/facade/user/UserFacade.java | 12 ++- .../manage/request/user/UserLoginRequest.java | 20 ++++ .../manage/repository/dao/TokenMapper.java | 15 +++ .../manage/repository/dao/UserMapper.java | 8 ++ .../repository/impl/TokenRepositoryImpl.java | 25 +++++ .../repository/impl/UserRepositoryImpl.java | 10 ++ .../main/resources/sqlmapper/TokenMapper.xml | 29 +++++ .../main/resources/sqlmapper/UserMapper.xml | 12 +++ pom.xml | 12 +++ service/pom.xml | 6 +- .../service/facade/user/UserFacadeImpl.java | 35 +++++- .../manage/service/mappers/UserMappers.java | 8 ++ 30 files changed, 597 insertions(+), 16 deletions(-) create mode 100644 domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/model/Token.java create mode 100644 domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/model/UserLoginInfo.java create mode 100644 domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/repository/TokenRepository.java create mode 100644 domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/service/TokenService.java create mode 100644 domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/service/impl/TokenServiceImpl.java rename electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/{model => result}/BaseResult.java (91%) create mode 100644 electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/result/LoginResult.java rename electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/{model => util}/BaseResultUtil.java (91%) create mode 100644 electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/util/LoginResultUtil.java create mode 100644 facade/src/main/java/com/electromagnetic/industry/software/data/manage/request/user/UserLoginRequest.java create mode 100644 infrastructure/repository/src/main/java/com/electromagnetic/industry/software/data/manage/repository/dao/TokenMapper.java create mode 100644 infrastructure/repository/src/main/java/com/electromagnetic/industry/software/data/manage/repository/impl/TokenRepositoryImpl.java create mode 100644 infrastructure/repository/src/main/resources/sqlmapper/TokenMapper.xml diff --git a/bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/user/UserController.java b/bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/user/UserController.java index 918ed6a..362da52 100644 --- a/bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/user/UserController.java +++ b/bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/user/UserController.java @@ -1,9 +1,10 @@ package com.electromagnetic.industry.software.data.manage.controller.user; import com.electromagnetic.industry.software.data.manage.facade.user.UserFacade; +import com.electromagnetic.industry.software.data.manage.request.user.UserLoginRequest; import com.electromagnetic.industry.software.data.manage.request.user.UserRequest; -import electromagnetic.data.framework.share.model.BaseResult; -import electromagnetic.data.framework.share.model.ElectromagneticResult; +import electromagnetic.data.framework.share.result.BaseResult; +import electromagnetic.data.framework.share.result.LoginResult; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; @@ -16,6 +17,12 @@ public class UserController { @Resource private UserFacade userFacade; + @ApiOperation(value = "登录", notes = "") + @PostMapping("/login") + public LoginResult login(@RequestBody UserLoginRequest loginRequest) { + return userFacade.login(loginRequest); + } + @ApiOperation(value = "新增用户信息", notes = "") @PostMapping public BaseResult createUser(@RequestBody UserRequest userRequest) { diff --git a/domain/pom.xml b/domain/pom.xml index 77aa05a..c134907 100644 --- a/domain/pom.xml +++ b/domain/pom.xml @@ -47,6 +47,11 @@ slf4j-api + + + io.jsonwebtoken + jjwt + \ No newline at end of file diff --git a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/model/Token.java b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/model/Token.java new file mode 100644 index 0000000..37e302f --- /dev/null +++ b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/model/Token.java @@ -0,0 +1,38 @@ +package com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model; + +import cn.hutool.core.date.DateTime; +import lombok.Data; + +@Data +public class Token { + + /** + * 主键ID + */ + private Long id; + + /** + * 用户编码 + */ + private String userId; + + /** + * 令牌 + */ + private String token; + + /** + * 是否是长期令牌 + */ + private int isLongTerm; + + /** + * 创建时间 + */ + private DateTime createdAt; + + /** + * 过期时间 + */ + private DateTime expireAt; +} diff --git a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/model/User.java b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/model/User.java index 522b707..f6d8a77 100644 --- a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/model/User.java +++ b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/model/User.java @@ -1,6 +1,5 @@ package com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model; -import cn.hutool.core.date.DateTime; import lombok.Data; import java.util.Date; @@ -51,7 +50,7 @@ public class User { /** * 入职日期 */ - private DateTime joinTime; + private Date joinTime; /** * 工作状态 diff --git a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/model/UserLoginInfo.java b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/model/UserLoginInfo.java new file mode 100644 index 0000000..bb6fcd3 --- /dev/null +++ b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/model/UserLoginInfo.java @@ -0,0 +1,22 @@ +package com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model; + +import lombok.Data; + +@Data +public class UserLoginInfo { + + /** + * 工号 + */ + private String workNumber; + + /** + * 用户密码 + */ + private String userPwd; + + /** + * 令牌 + */ + private String token; +} diff --git a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/repository/TokenRepository.java b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/repository/TokenRepository.java new file mode 100644 index 0000000..01b6928 --- /dev/null +++ b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/repository/TokenRepository.java @@ -0,0 +1,13 @@ +package com.electromagnetic.industry.software.data.manage.domain.boardservice.user.repository; + +import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.Token; + +public interface TokenRepository { + + /** + * 令牌插入 + * @param token + * @return + */ + int insert(Token token); +} diff --git a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/repository/UserRepository.java b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/repository/UserRepository.java index eaf8b9e..cfc0f1b 100644 --- a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/repository/UserRepository.java +++ b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/repository/UserRepository.java @@ -10,4 +10,11 @@ public interface UserRepository { * @return */ int insert(User user); + + /** + * 通过工号查询用户 + * @param workNumber + * @return + */ + User selectUserByWorkNumber(String workNumber); } diff --git a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/service/TokenService.java b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/service/TokenService.java new file mode 100644 index 0000000..6446c4c --- /dev/null +++ b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/service/TokenService.java @@ -0,0 +1,23 @@ +package com.electromagnetic.industry.software.data.manage.domain.boardservice.user.service; + +import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.Token; +import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.User; +import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.UserLoginInfo; + +public interface TokenService { + + /** + * 创建令牌 + * @param loginInfo + * @return 令牌 + */ + public String createToken(UserLoginInfo loginInfo); + + /** + * 创建用户令牌 + * @param user + * @param tokenStr + * @return + */ + public Boolean createUserToken (User user, String tokenStr); +} diff --git a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/service/UserService.java b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/service/UserService.java index 3431c6e..d8f750f 100644 --- a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/service/UserService.java +++ b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/service/UserService.java @@ -1,6 +1,7 @@ package com.electromagnetic.industry.software.data.manage.domain.boardservice.user.service; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.User; +import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.UserLoginInfo; public interface UserService { @@ -10,4 +11,19 @@ public interface UserService { * @return */ Boolean createUser(User user); + + /** + * 通过工号查询用户 + * @param workNumber + * @return + */ + User getUserByWorkNumber(String workNumber); + + /** + * 比较密码是否相同 + * @param user + * @param password + * @return + */ + Boolean matchPassword(User user, String password); } diff --git a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/service/impl/TokenServiceImpl.java b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/service/impl/TokenServiceImpl.java new file mode 100644 index 0000000..9bfbc3a --- /dev/null +++ b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/service/impl/TokenServiceImpl.java @@ -0,0 +1,59 @@ +package com.electromagnetic.industry.software.data.manage.domain.boardservice.user.service.impl; + +import cn.hutool.core.date.DateTime; +import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.Token; +import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.User; +import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.UserLoginInfo; +import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.repository.TokenRepository; +import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.service.TokenService; +import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.util.UserConstant; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import static cn.hutool.core.date.SystemClock.now; + +@Service +public class TokenServiceImpl implements TokenService { + + @Resource + TokenRepository tokenRepository; + + /** + * 创建令牌 + * @param loginInfo + * @return 令牌 + */ + @Override + public String createToken(UserLoginInfo loginInfo){ + String token = UUID.randomUUID().toString(); + loginInfo.setToken(token); + Map claims = new HashMap<>(); + claims.put(UserConstant.LOGIN_USER_KEY, loginInfo); + Jwts.builder() + .addClaims(claims) + .signWith(SignatureAlgorithm.HS512, UserConstant.SECRET_KEY) + .compact(); + return token; + } + + /** + * 创建用户令牌 + * @param user + * @param tokenStr + * @return + */ + @Override + public Boolean createUserToken (User user, String tokenStr){ + Token token = new Token(); + token.setUserId(user.getUserId()); + token.setToken(tokenStr); + token.setExpireAt(new DateTime(now()+UserConstant.DEFAULT_EXPIRE_TIME)); + return tokenRepository.insert(token)>0; + } +} diff --git a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/service/impl/UserServiceImpl.java b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/service/impl/UserServiceImpl.java index 8074adb..ec09e28 100644 --- a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/service/impl/UserServiceImpl.java +++ b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/service/impl/UserServiceImpl.java @@ -3,7 +3,9 @@ package com.electromagnetic.industry.software.data.manage.domain.boardservice.us import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.User; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.repository.UserRepository; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.service.UserService; +import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.util.UserConstant; import electromagnetic.data.framework.share.exception.LoggerConstant; +import electromagnetic.data.framework.share.util.SignUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; @@ -27,4 +29,26 @@ public class UserServiceImpl implements UserService { public Boolean createUser(User user) { return userRepository.insert(user)>0; } + + /** + * 通过工号查询用户 + * @param workNumber + * @return + */ + @Override + public User getUserByWorkNumber(String workNumber){ + return userRepository.selectUserByWorkNumber(workNumber); + } + + /** + * 比较密码是否相同 + * @param user + * @param password + */ + @Override + public Boolean matchPassword(User user, String password){ + String salt = user.getSalt(); + String encodePwd = SignUtils.MD5(UserConstant.DEFAULT_PASSWORD+salt); + return user.getUserPwd().equals(encodePwd); + } } diff --git a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/util/UserConstant.java b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/util/UserConstant.java index bb15bf4..d0edb39 100644 --- a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/util/UserConstant.java +++ b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/util/UserConstant.java @@ -11,4 +11,19 @@ public class UserConstant { * 默认发布状态(未发布) */ public static final int DEFAULT_PUBLISH_STATUS = 0; + + /** + * 默认令牌过期时间(7天) + */ + public static final long DEFAULT_EXPIRE_TIME = 7*24*60*60*1000; + + /** + * 令牌密钥 + */ + public static final String SECRET_KEY = "5JKRGV0QO4WK1WCWVK55YEU0A1NPOXOP"; + + /** + * 令牌前缀 + */ + public static final String LOGIN_USER_KEY = "login_user_key"; } diff --git a/electromagnetic-framework/pom.xml b/electromagnetic-framework/pom.xml index 7a1b726..899213d 100644 --- a/electromagnetic-framework/pom.xml +++ b/electromagnetic-framework/pom.xml @@ -63,6 +63,14 @@ junit test + + org.bouncycastle + bcprov-jdk16 + + + org.apache.tomcat.embed + tomcat-embed-core + \ No newline at end of file diff --git a/electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/model/BaseResult.java b/electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/result/BaseResult.java similarity index 91% rename from electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/model/BaseResult.java rename to electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/result/BaseResult.java index 07852fc..769682b 100644 --- a/electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/model/BaseResult.java +++ b/electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/result/BaseResult.java @@ -1,7 +1,4 @@ -package electromagnetic.data.framework.share.model; - -import electromagnetic.data.framework.share.result.Message; -import electromagnetic.data.framework.share.result.Result; +package electromagnetic.data.framework.share.result; import java.io.Serializable; diff --git a/electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/result/LoginResult.java b/electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/result/LoginResult.java new file mode 100644 index 0000000..6ea7fa9 --- /dev/null +++ b/electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/result/LoginResult.java @@ -0,0 +1,100 @@ +package electromagnetic.data.framework.share.result; + +import java.io.Serializable; + +public class LoginResult implements Serializable{ + + private static final long serialVersionUID = 1L; + + /** + * 请求成功还是失败 + */ + private Boolean success; + + /** + * 错误码 + */ + private String errorCode; + + /** + * 错误消息 + */ + private String errorMessage; + + /** + * 令牌 + */ + private String token; + + public LoginResult() { + + } + + public LoginResult(Boolean success, String errorCode, String errorMessage, String token) { + this.success = success; + this.errorCode = errorCode; + this.errorMessage = errorMessage; + this.token = token; + } + + /** + * Getter method for property success. + * + * @return property value of success + */ + public Boolean getSuccess() { + return success; + } + + /** + * Setter method for property success. + * + * @param success value to be assigned to property success + */ + public void setSuccess(Boolean success) { + this.success = success; + } + + /** + * Getter method for property errorCode. + * + * @return property value of errorCode + */ + public String getErrorCode() { + return errorCode; + } + + /** + * Setter method for property errorCode. + * + * @param errorCode value to be assigned to property errorCode + */ + public void setErrorCode(String errorCode) { + this.errorCode = errorCode; + } + + /** + * Getter method for property errorMsg. + * + * @return property value of errorMsg + */ + public String getErrorMessage() { + return errorMessage; + } + + /** + * Setter method for property errorMsg. + * + * @param errorMessage value to be assigned to property errorMsg + */ + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + + public String getToken() { + return token; + } + public void setToken(String token) { + this.token = token; + } +} diff --git a/electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/sign/AESUtils.java b/electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/sign/AESUtils.java index fcedd02..c8bcbf8 100644 --- a/electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/sign/AESUtils.java +++ b/electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/sign/AESUtils.java @@ -14,6 +14,9 @@ import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.apache.tomcat.util.codec.binary.Base64; +import java.security.Security; /** *

Description: [AES对称加密和解密]

@@ -117,6 +120,32 @@ public class AESUtils { return null; } + /** + * 前端使用ECB,后端解密方法 + * @param enc + * @param key + * @return + */ + public static String decrypt(String enc, String key) { + try{ + SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES"); + Security.addProvider(new BouncyCastleProvider()); + Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding"); + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec); + return cipher.doFinal(Base64.decodeBase64(enc)).toString(); + } catch (NoSuchPaddingException e) { + throw new RuntimeException(e); + } catch (IllegalBlockSizeException e) { + throw new RuntimeException(e); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } catch (BadPaddingException e) { + throw new RuntimeException(e); + } catch (InvalidKeyException e) { + throw new RuntimeException(e); + } + } + // public static void main(String[] args) { // try { // diff --git a/electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/model/BaseResultUtil.java b/electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/util/BaseResultUtil.java similarity index 91% rename from electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/model/BaseResultUtil.java rename to electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/util/BaseResultUtil.java index 76d2471..92cb311 100644 --- a/electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/model/BaseResultUtil.java +++ b/electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/util/BaseResultUtil.java @@ -1,12 +1,12 @@ -package electromagnetic.data.framework.share.model; +package electromagnetic.data.framework.share.util; import electromagnetic.data.framework.share.enums.ErrorEnum; +import electromagnetic.data.framework.share.result.BaseResult; import electromagnetic.data.framework.share.result.CallbackResult; /** * 返回结果转换工具类 * - * @version $Id: DataCenterResultUtil.java, v 0.1 2021-01-11 16:57 Exp $$ */ public class BaseResultUtil { diff --git a/electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/util/LoginResultUtil.java b/electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/util/LoginResultUtil.java new file mode 100644 index 0000000..5458bc6 --- /dev/null +++ b/electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/util/LoginResultUtil.java @@ -0,0 +1,39 @@ +package electromagnetic.data.framework.share.util; + +import electromagnetic.data.framework.share.enums.ErrorEnum; +import electromagnetic.data.framework.share.result.CallbackResult; +import electromagnetic.data.framework.share.result.LoginResult; + +public class LoginResultUtil { + + public static LoginResult convertToResult(CallbackResult callbackResult) { + LoginResult LoginResult = new LoginResult<>(); + LoginResult.setSuccess(callbackResult.isSuccess()); + LoginResult.setErrorCode(callbackResult.getResultCode()); + LoginResult.setErrorMessage(callbackResult.getResultMessage()); + return LoginResult; + } + + public static LoginResult success(String token){ + LoginResult LoginResult = new LoginResult<>(); + LoginResult.setSuccess(true); + LoginResult.setToken(token); + return LoginResult; + } + + public static LoginResult fail(String code , String msg){ + LoginResult LoginResult = new LoginResult<>(); + LoginResult.setSuccess(false); + LoginResult.setErrorCode(code); + LoginResult.setErrorMessage(msg); + return LoginResult; + } + + public static LoginResult fail(ErrorEnum errorEnum){ + LoginResult LoginResult = new LoginResult<>(); + LoginResult.setSuccess(false); + LoginResult.setErrorCode(errorEnum.getCode()); + LoginResult.setErrorMessage(errorEnum.getErrorMessage()); + return LoginResult; + } +} diff --git a/facade/src/main/java/com/electromagnetic/industry/software/data/manage/facade/user/UserFacade.java b/facade/src/main/java/com/electromagnetic/industry/software/data/manage/facade/user/UserFacade.java index 4fc3b20..3fb052e 100644 --- a/facade/src/main/java/com/electromagnetic/industry/software/data/manage/facade/user/UserFacade.java +++ b/facade/src/main/java/com/electromagnetic/industry/software/data/manage/facade/user/UserFacade.java @@ -1,11 +1,19 @@ package com.electromagnetic.industry.software.data.manage.facade.user; +import com.electromagnetic.industry.software.data.manage.request.user.UserLoginRequest; import com.electromagnetic.industry.software.data.manage.request.user.UserRequest; -import electromagnetic.data.framework.share.model.BaseResult; -import electromagnetic.data.framework.share.model.ElectromagneticResult; +import electromagnetic.data.framework.share.result.BaseResult; +import electromagnetic.data.framework.share.result.LoginResult; public interface UserFacade { + /** + * 用户登录 + * @param loginRequest + * @return + */ + LoginResult login(UserLoginRequest loginRequest); + /** * 新增用户信息 * @param userRequest diff --git a/facade/src/main/java/com/electromagnetic/industry/software/data/manage/request/user/UserLoginRequest.java b/facade/src/main/java/com/electromagnetic/industry/software/data/manage/request/user/UserLoginRequest.java new file mode 100644 index 0000000..654c7fb --- /dev/null +++ b/facade/src/main/java/com/electromagnetic/industry/software/data/manage/request/user/UserLoginRequest.java @@ -0,0 +1,20 @@ +package com.electromagnetic.industry.software.data.manage.request.user; + +import electromagnetic.data.framework.share.model.BaseRequest; +import lombok.Data; + +import java.io.Serializable; + +@Data +public class UserLoginRequest extends BaseRequest implements Serializable { + + /** + * 工号 + */ + private String workNumber; + + /** + * 用户密码 + */ + private String userPwd; +} diff --git a/infrastructure/repository/src/main/java/com/electromagnetic/industry/software/data/manage/repository/dao/TokenMapper.java b/infrastructure/repository/src/main/java/com/electromagnetic/industry/software/data/manage/repository/dao/TokenMapper.java new file mode 100644 index 0000000..fb67a60 --- /dev/null +++ b/infrastructure/repository/src/main/java/com/electromagnetic/industry/software/data/manage/repository/dao/TokenMapper.java @@ -0,0 +1,15 @@ +package com.electromagnetic.industry.software.data.manage.repository.dao; + +import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.Token; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface TokenMapper { + + /** + * 插入 + * @param token + * @return + */ + int insert(Token token); +} diff --git a/infrastructure/repository/src/main/java/com/electromagnetic/industry/software/data/manage/repository/dao/UserMapper.java b/infrastructure/repository/src/main/java/com/electromagnetic/industry/software/data/manage/repository/dao/UserMapper.java index c89b44a..ae6d137 100644 --- a/infrastructure/repository/src/main/java/com/electromagnetic/industry/software/data/manage/repository/dao/UserMapper.java +++ b/infrastructure/repository/src/main/java/com/electromagnetic/industry/software/data/manage/repository/dao/UserMapper.java @@ -5,10 +5,18 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface UserMapper { + /** * 插入 * @param user * @return */ int insert(User user); + + /** + * 通过工号查询用户 + * @param workNumber + * @return + */ + User selectUserByWorkNumber(String workNumber); } \ No newline at end of file diff --git a/infrastructure/repository/src/main/java/com/electromagnetic/industry/software/data/manage/repository/impl/TokenRepositoryImpl.java b/infrastructure/repository/src/main/java/com/electromagnetic/industry/software/data/manage/repository/impl/TokenRepositoryImpl.java new file mode 100644 index 0000000..af4e7b7 --- /dev/null +++ b/infrastructure/repository/src/main/java/com/electromagnetic/industry/software/data/manage/repository/impl/TokenRepositoryImpl.java @@ -0,0 +1,25 @@ +package com.electromagnetic.industry.software.data.manage.repository.impl; + +import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.Token; +import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.repository.TokenRepository; +import com.electromagnetic.industry.software.data.manage.repository.dao.TokenMapper; +import org.springframework.stereotype.Repository; + +import javax.annotation.Resource; + +@Repository +public class TokenRepositoryImpl implements TokenRepository { + + @Resource + TokenMapper tokenMapper; + + /** + * 令牌插入 + * @param token + * @return + */ + @Override + public int insert(Token token){ + return tokenMapper.insert(token); + } +} diff --git a/infrastructure/repository/src/main/java/com/electromagnetic/industry/software/data/manage/repository/impl/UserRepositoryImpl.java b/infrastructure/repository/src/main/java/com/electromagnetic/industry/software/data/manage/repository/impl/UserRepositoryImpl.java index 59d4410..36958fa 100644 --- a/infrastructure/repository/src/main/java/com/electromagnetic/industry/software/data/manage/repository/impl/UserRepositoryImpl.java +++ b/infrastructure/repository/src/main/java/com/electromagnetic/industry/software/data/manage/repository/impl/UserRepositoryImpl.java @@ -26,4 +26,14 @@ public class UserRepositoryImpl implements UserRepository { public int insert(User user) { return userMapper.insert(user); } + + /** + * 通过工号查询用户 + * @param workNumber + * @return + */ + @Override + public User selectUserByWorkNumber(String workNumber) { + return userMapper.selectUserByWorkNumber(workNumber); + } } \ No newline at end of file diff --git a/infrastructure/repository/src/main/resources/sqlmapper/TokenMapper.xml b/infrastructure/repository/src/main/resources/sqlmapper/TokenMapper.xml new file mode 100644 index 0000000..0ab10d0 --- /dev/null +++ b/infrastructure/repository/src/main/resources/sqlmapper/TokenMapper.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + insert into tokens( + user_id, + token, + is_long_term, + created_at, + expire_at + ) + values ( + #{userId}, + #{token}, + 0, + now(), + #{expireAt} + ) + + \ No newline at end of file diff --git a/infrastructure/repository/src/main/resources/sqlmapper/UserMapper.xml b/infrastructure/repository/src/main/resources/sqlmapper/UserMapper.xml index 9aec6ea..1780886 100644 --- a/infrastructure/repository/src/main/resources/sqlmapper/UserMapper.xml +++ b/infrastructure/repository/src/main/resources/sqlmapper/UserMapper.xml @@ -24,6 +24,13 @@ + + select user_id, user_name, work_number, mobile, user_dept, user_title, user_pwd, + join_time, is_published, salt, user_status, internship_end_date, + creator, creator_name, gmt_create, modifier, modifier_name, gmt_modified, effect_flag + from ed_users + + insert into ed_users( user_id, @@ -61,4 +68,9 @@ 1 ) + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index c914ac9..a309f07 100644 --- a/pom.xml +++ b/pom.xml @@ -40,6 +40,7 @@ 2.0.1.Final 6.0.18.Final 1.0.2.1-SNAPSHOT + 0.9.0 @@ -239,6 +240,17 @@ hibernate-validator ${hibernate.validator.version} + + + io.jsonwebtoken + jjwt + ${jwt.version} + + + org.bouncycastle + bcprov-jdk16 + 1.46 + diff --git a/service/pom.xml b/service/pom.xml index 413ddd2..595bedf 100644 --- a/service/pom.xml +++ b/service/pom.xml @@ -41,6 +41,10 @@ org.apache.commons commons-lang3 - + + org.bouncycastle + bcprov-jdk16 + 1.46 + diff --git a/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/user/UserFacadeImpl.java b/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/user/UserFacadeImpl.java index 33a58bb..fe90f01 100644 --- a/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/user/UserFacadeImpl.java +++ b/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/user/UserFacadeImpl.java @@ -1,14 +1,22 @@ package com.electromagnetic.industry.software.data.manage.service.facade.user; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.User; +import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.UserLoginInfo; +import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.service.TokenService; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.service.UserService; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.util.UserConstant; import com.electromagnetic.industry.software.data.manage.facade.user.UserFacade; +import com.electromagnetic.industry.software.data.manage.request.user.UserLoginRequest; import com.electromagnetic.industry.software.data.manage.request.user.UserRequest; import com.electromagnetic.industry.software.data.manage.service.mappers.UserMappers; import electromagnetic.data.framework.share.id.IdWorker; -import electromagnetic.data.framework.share.model.BaseResult; -import electromagnetic.data.framework.share.model.BaseResultUtil; +import electromagnetic.data.framework.share.result.BaseResult; +import electromagnetic.data.framework.share.result.LoginResult; +import electromagnetic.data.framework.share.sign.AESUtils; +import electromagnetic.data.framework.share.util.BaseResultUtil; +import electromagnetic.data.framework.share.util.LoginResultUtil; +import electromagnetic.data.framework.share.util.SignUtils; +import org.apache.commons.lang3.RandomStringUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -18,6 +26,26 @@ public class UserFacadeImpl implements UserFacade { @Resource private UserService userService; + @Resource + private TokenService tokenService; + + /** + * 用户登录 + * @param loginRequest + * @return + */ + @Override + public LoginResult login(UserLoginRequest loginRequest) { + UserLoginInfo info = UserMappers.INSTANCE.getUserLoginRequestToModel(loginRequest); + String decodePwd = AESUtils.decrypt(info.getUserPwd(), UserConstant.SECRET_KEY); + User user = userService.getUserByWorkNumber(info.getWorkNumber()); + if (user==null || userService.matchPassword(user, decodePwd)) { + String tokenStr = tokenService.createToken(info); + tokenService.createUserToken(user, tokenStr); + return LoginResultUtil.success(tokenStr); + } + return LoginResultUtil.fail("500","用户不存在/密码错误"); + } /** * 新增用户信息 @@ -27,8 +55,9 @@ public class UserFacadeImpl implements UserFacade { @Override public BaseResult createUser(UserRequest userRequest){ User user = UserMappers.INSTANCE.getUserRequestToModel(userRequest); + user.setSalt(RandomStringUtils.randomAlphanumeric(16)); user.setUserId(IdWorker.getSnowFlakeIdString()); - user.setUserPwd(UserConstant.DEFAULT_PASSWORD); + user.setUserPwd(SignUtils.MD5(UserConstant.DEFAULT_PASSWORD+user.getSalt())); user.setIsPublished(UserConstant.DEFAULT_PUBLISH_STATUS); return BaseResultUtil.success(userService.createUser(user)); } diff --git a/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/mappers/UserMappers.java b/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/mappers/UserMappers.java index 11a915e..dcf4ac9 100644 --- a/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/mappers/UserMappers.java +++ b/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/mappers/UserMappers.java @@ -4,6 +4,8 @@ package com.electromagnetic.industry.software.data.manage.service.mappers; import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.User; +import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.model.UserLoginInfo; +import com.electromagnetic.industry.software.data.manage.request.user.UserLoginRequest; import com.electromagnetic.industry.software.data.manage.request.user.UserRequest; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -25,4 +27,10 @@ public interface UserMappers { */ User getUserRequestToModel(UserRequest userRequest); + /** + * 用户登录Request转用户登录模型 + * @param loginRequest + * @return + */ + UserLoginInfo getUserLoginRequestToModel(UserLoginRequest loginRequest); } \ No newline at end of file