From e18b9a89623b3a5811f34a143db35ddd9ebedc38 Mon Sep 17 00:00:00 2001 From: tjq Date: Sun, 11 Feb 2024 17:14:21 +0800 Subject: [PATCH] feat: [auth] finished login part --- .../server/auth/common/AuthConstants.java | 5 ++++ .../server/auth/common/AuthErrorCode.java | 2 ++ .../auth/interceptor/ApiPermission.java | 2 +- .../auth/login/impl/DingTalkLoginService.java | 2 ++ .../impl/PowerJobThirdPartyLoginService.java | 24 ++++++++++++------- .../login/impl/PowerJobLoginServiceImpl.java | 2 +- .../server/core/service/UserService.java | 12 ++++++++++ .../persistence/remote/model/NamespaceDO.java | 5 ++++ .../server/web/controller/AuthController.java | 3 ++- .../web/request/ModifyUserInfoRequest.java | 1 + 10 files changed, 47 insertions(+), 11 deletions(-) diff --git a/powerjob-server/powerjob-server-auth/src/main/java/tech/powerjob/server/auth/common/AuthConstants.java b/powerjob-server/powerjob-server-auth/src/main/java/tech/powerjob/server/auth/common/AuthConstants.java index ab467721..8bb4547f 100644 --- a/powerjob-server/powerjob-server-auth/src/main/java/tech/powerjob/server/auth/common/AuthConstants.java +++ b/powerjob-server/powerjob-server-auth/src/main/java/tech/powerjob/server/auth/common/AuthConstants.java @@ -9,4 +9,9 @@ package tech.powerjob.server.auth.common; public class AuthConstants { public static final String JWT_NAME = "power_jwt"; + + /** + * 前端跳转到指定页面指令 + */ + public static final String FE_REDIRECT_KEY = "FE-REDIRECT:"; } diff --git a/powerjob-server/powerjob-server-auth/src/main/java/tech/powerjob/server/auth/common/AuthErrorCode.java b/powerjob-server/powerjob-server-auth/src/main/java/tech/powerjob/server/auth/common/AuthErrorCode.java index 25563819..254dbd06 100644 --- a/powerjob-server/powerjob-server-auth/src/main/java/tech/powerjob/server/auth/common/AuthErrorCode.java +++ b/powerjob-server/powerjob-server-auth/src/main/java/tech/powerjob/server/auth/common/AuthErrorCode.java @@ -14,6 +14,8 @@ import lombok.Getter; public enum AuthErrorCode { USER_NOT_LOGIN("-100", "UserNotLoggedIn"), + USER_NOT_EXIST("-101", "UserNotExist"), + NO_PERMISSION("-200", "NoPermission"), diff --git a/powerjob-server/powerjob-server-auth/src/main/java/tech/powerjob/server/auth/interceptor/ApiPermission.java b/powerjob-server/powerjob-server-auth/src/main/java/tech/powerjob/server/auth/interceptor/ApiPermission.java index 099447e5..c8efe157 100644 --- a/powerjob-server/powerjob-server-auth/src/main/java/tech/powerjob/server/auth/interceptor/ApiPermission.java +++ b/powerjob-server/powerjob-server-auth/src/main/java/tech/powerjob/server/auth/interceptor/ApiPermission.java @@ -28,7 +28,7 @@ public @interface ApiPermission { * 需要的权限 * @return 权限 */ - Permission requiredPermission() default Permission.GLOBAL_SU; + Permission requiredPermission() default Permission.SU; /** * 固定权限不支持的场景,需要使用动态权限 diff --git a/powerjob-server/powerjob-server-auth/src/main/java/tech/powerjob/server/auth/login/impl/DingTalkLoginService.java b/powerjob-server/powerjob-server-auth/src/main/java/tech/powerjob/server/auth/login/impl/DingTalkLoginService.java index 731b20a5..539f2ab7 100644 --- a/powerjob-server/powerjob-server-auth/src/main/java/tech/powerjob/server/auth/login/impl/DingTalkLoginService.java +++ b/powerjob-server/powerjob-server-auth/src/main/java/tech/powerjob/server/auth/login/impl/DingTalkLoginService.java @@ -9,6 +9,7 @@ import com.aliyun.teautil.models.RuntimeOptions; import lombok.SneakyThrows; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; import tech.powerjob.common.exception.PowerJobException; import tech.powerjob.server.auth.login.*; import tech.powerjob.server.common.Loggers; @@ -27,6 +28,7 @@ import java.nio.charset.StandardCharsets; * @author tjq * @since 2023/3/26 */ +@Service public class DingTalkLoginService implements ThirdPartyLoginService { /* diff --git a/powerjob-server/powerjob-server-auth/src/main/java/tech/powerjob/server/auth/login/impl/PowerJobThirdPartyLoginService.java b/powerjob-server/powerjob-server-auth/src/main/java/tech/powerjob/server/auth/login/impl/PowerJobThirdPartyLoginService.java index e669e1b6..43b76abd 100644 --- a/powerjob-server/powerjob-server-auth/src/main/java/tech/powerjob/server/auth/login/impl/PowerJobThirdPartyLoginService.java +++ b/powerjob-server/powerjob-server-auth/src/main/java/tech/powerjob/server/auth/login/impl/PowerJobThirdPartyLoginService.java @@ -1,14 +1,18 @@ package tech.powerjob.server.auth.login.impl; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import tech.powerjob.common.exception.PowerJobException; +import tech.powerjob.common.serialize.JsonUtils; +import tech.powerjob.server.auth.common.AuthConstants; +import tech.powerjob.server.auth.common.AuthErrorCode; +import tech.powerjob.server.auth.common.PowerJobAuthException; import tech.powerjob.server.auth.login.LoginTypeInfo; import tech.powerjob.server.auth.login.ThirdPartyLoginRequest; import tech.powerjob.server.auth.login.ThirdPartyLoginService; import tech.powerjob.server.auth.login.ThirdPartyUser; import tech.powerjob.server.common.Loggers; -import tech.powerjob.server.common.SJ; import tech.powerjob.server.common.utils.DigestUtils; import tech.powerjob.server.persistence.remote.model.UserInfoDO; import tech.powerjob.server.persistence.remote.repository.UserInfoRepository; @@ -36,18 +40,20 @@ public class PowerJobThirdPartyLoginService implements ThirdPartyLoginService { private static final String KEY_USERNAME = "username"; private static final String KEY_PASSWORD = "password"; + private static final String KEY_ENCRYPTION = "encryption"; + @Override public LoginTypeInfo loginType() { return new LoginTypeInfo() .setType(POWER_JOB_LOGIN_SERVICE) - .setName("PowerJob's built-in login system") + .setName("PowerJob") ; } @Override public String generateLoginUrl(HttpServletRequest httpServletRequest) { // 前端实现跳转,服务端返回特殊指令 - return "FE-REDIRECT:PowerJob"; + return AuthConstants.FE_REDIRECT_KEY.concat("powerjobLogin"); } @Override @@ -57,19 +63,21 @@ public class PowerJobThirdPartyLoginService implements ThirdPartyLoginService { throw new IllegalArgumentException("can't find login Info"); } - final Map loginInfoMap = SJ.splitKvString(loginInfo); - final String username = loginInfoMap.get(KEY_USERNAME); - final String password = loginInfoMap.get(KEY_PASSWORD); + Map loginInfoMap = JsonUtils.parseMap(loginInfo); + + final String username = MapUtils.getString(loginInfoMap, KEY_USERNAME); + final String password = MapUtils.getString(loginInfoMap, KEY_PASSWORD); + final String encryption = MapUtils.getString(loginInfoMap, KEY_ENCRYPTION); if (StringUtils.isAnyEmpty(username, password)) { Loggers.WEB.debug("[PowerJobLoginService] username or password is empty, login failed!"); - throw new IllegalArgumentException("username or password is empty!"); + throw new PowerJobAuthException(AuthErrorCode.INVALID_REQUEST); } final Optional userInfoOpt = userInfoRepository.findByUsername(username); if (!userInfoOpt.isPresent()) { Loggers.WEB.debug("[PowerJobLoginService] can't find user by username: {}", username); - throw new PowerJobException("can't find user by username: " + username); + throw new PowerJobAuthException(AuthErrorCode.USER_NOT_EXIST); } final UserInfoDO dbUser = userInfoOpt.get(); diff --git a/powerjob-server/powerjob-server-auth/src/main/java/tech/powerjob/server/auth/service/login/impl/PowerJobLoginServiceImpl.java b/powerjob-server/powerjob-server-auth/src/main/java/tech/powerjob/server/auth/service/login/impl/PowerJobLoginServiceImpl.java index 2e955ab0..4244fe84 100644 --- a/powerjob-server/powerjob-server-auth/src/main/java/tech/powerjob/server/auth/service/login/impl/PowerJobLoginServiceImpl.java +++ b/powerjob-server/powerjob-server-auth/src/main/java/tech/powerjob/server/auth/service/login/impl/PowerJobLoginServiceImpl.java @@ -141,7 +141,7 @@ public class PowerJobLoginServiceImpl implements PowerJobLoginService { // header、cookie 都能获取 String jwtStr = httpServletRequest.getHeader(AuthConstants.JWT_NAME); if (StringUtils.isEmpty(jwtStr)) { - for (Cookie cookie : httpServletRequest.getCookies()) { + for (Cookie cookie : Optional.ofNullable(httpServletRequest.getCookies()).orElse(new Cookie[]{})) { if (cookie.getName().equals(AuthConstants.JWT_NAME)) { jwtStr = cookie.getValue(); } diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/service/UserService.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/service/UserService.java index 6acea5bd..21dc50c7 100644 --- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/service/UserService.java +++ b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/service/UserService.java @@ -1,5 +1,7 @@ package tech.powerjob.server.core.service; +import tech.powerjob.common.utils.CommonUtils; +import tech.powerjob.server.common.utils.DigestUtils; import tech.powerjob.server.persistence.remote.model.UserInfoDO; import tech.powerjob.server.persistence.remote.repository.UserInfoRepository; import com.google.common.base.Splitter; @@ -30,8 +32,18 @@ public class UserService { * @param userInfoDO user */ public void save(UserInfoDO userInfoDO) { + + CommonUtils.requireNonNull(userInfoDO.getUsername(), "userName can't be null or empty!"); + userInfoDO.setGmtCreate(new Date()); userInfoDO.setGmtModified(userInfoDO.getGmtCreate()); + + // 二次加密密码 + final String password = userInfoDO.getPassword(); + if (StringUtils.isNotEmpty(password)) { + userInfoDO.setPassword(DigestUtils.rePassword(password, userInfoDO.getUsername())); + } + userInfoRepository.saveAndFlush(userInfoDO); } diff --git a/powerjob-server/powerjob-server-persistence/src/main/java/tech/powerjob/server/persistence/remote/model/NamespaceDO.java b/powerjob-server/powerjob-server-persistence/src/main/java/tech/powerjob/server/persistence/remote/model/NamespaceDO.java index c1089926..7abbc8b3 100644 --- a/powerjob-server/powerjob-server-persistence/src/main/java/tech/powerjob/server/persistence/remote/model/NamespaceDO.java +++ b/powerjob-server/powerjob-server-persistence/src/main/java/tech/powerjob/server/persistence/remote/model/NamespaceDO.java @@ -39,6 +39,11 @@ public class NamespaceDO { private Integer status; + /** + * 标签,扩展性之王,多值逗号分割 + */ + private String tags; + /** * 扩展字段 */ diff --git a/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/AuthController.java b/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/AuthController.java index 5b0195f2..702fdfd9 100644 --- a/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/AuthController.java +++ b/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/AuthController.java @@ -67,7 +67,8 @@ public class AuthController { * @return 登录结果 */ @PostMapping("/thirdPartyLoginDirect") - public ResultDTO selfLogin(LoginRequest loginRequest, HttpServletResponse httpServletResponse) { + public ResultDTO selfLogin(@RequestBody LoginRequest loginRequest, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { + loginRequest.setHttpServletRequest(httpServletRequest); try { final PowerJobUser powerJobUser = powerJobLoginService.doLogin(loginRequest); if (powerJobUser == null) { diff --git a/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/request/ModifyUserInfoRequest.java b/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/request/ModifyUserInfoRequest.java index db43e346..ced60c55 100644 --- a/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/request/ModifyUserInfoRequest.java +++ b/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/request/ModifyUserInfoRequest.java @@ -14,6 +14,7 @@ public class ModifyUserInfoRequest { private Long id; private String username; + private String nick; private String password; private String webHook;