feat: [auth] finished login part

This commit is contained in:
tjq 2024-02-11 17:14:21 +08:00
parent cf8153ae39
commit e18b9a8962
10 changed files with 47 additions and 11 deletions

View File

@ -9,4 +9,9 @@ package tech.powerjob.server.auth.common;
public class AuthConstants { public class AuthConstants {
public static final String JWT_NAME = "power_jwt"; public static final String JWT_NAME = "power_jwt";
/**
* 前端跳转到指定页面指令
*/
public static final String FE_REDIRECT_KEY = "FE-REDIRECT:";
} }

View File

@ -14,6 +14,8 @@ import lombok.Getter;
public enum AuthErrorCode { public enum AuthErrorCode {
USER_NOT_LOGIN("-100", "UserNotLoggedIn"), USER_NOT_LOGIN("-100", "UserNotLoggedIn"),
USER_NOT_EXIST("-101", "UserNotExist"),
NO_PERMISSION("-200", "NoPermission"), NO_PERMISSION("-200", "NoPermission"),

View File

@ -28,7 +28,7 @@ public @interface ApiPermission {
* 需要的权限 * 需要的权限
* @return 权限 * @return 权限
*/ */
Permission requiredPermission() default Permission.GLOBAL_SU; Permission requiredPermission() default Permission.SU;
/** /**
* 固定权限不支持的场景需要使用动态权限 * 固定权限不支持的场景需要使用动态权限

View File

@ -9,6 +9,7 @@ import com.aliyun.teautil.models.RuntimeOptions;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import tech.powerjob.common.exception.PowerJobException; import tech.powerjob.common.exception.PowerJobException;
import tech.powerjob.server.auth.login.*; import tech.powerjob.server.auth.login.*;
import tech.powerjob.server.common.Loggers; import tech.powerjob.server.common.Loggers;
@ -27,6 +28,7 @@ import java.nio.charset.StandardCharsets;
* @author tjq * @author tjq
* @since 2023/3/26 * @since 2023/3/26
*/ */
@Service
public class DingTalkLoginService implements ThirdPartyLoginService { public class DingTalkLoginService implements ThirdPartyLoginService {
/* /*

View File

@ -1,14 +1,18 @@
package tech.powerjob.server.auth.login.impl; package tech.powerjob.server.auth.login.impl;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import tech.powerjob.common.exception.PowerJobException; 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.LoginTypeInfo;
import tech.powerjob.server.auth.login.ThirdPartyLoginRequest; import tech.powerjob.server.auth.login.ThirdPartyLoginRequest;
import tech.powerjob.server.auth.login.ThirdPartyLoginService; import tech.powerjob.server.auth.login.ThirdPartyLoginService;
import tech.powerjob.server.auth.login.ThirdPartyUser; import tech.powerjob.server.auth.login.ThirdPartyUser;
import tech.powerjob.server.common.Loggers; import tech.powerjob.server.common.Loggers;
import tech.powerjob.server.common.SJ;
import tech.powerjob.server.common.utils.DigestUtils; import tech.powerjob.server.common.utils.DigestUtils;
import tech.powerjob.server.persistence.remote.model.UserInfoDO; import tech.powerjob.server.persistence.remote.model.UserInfoDO;
import tech.powerjob.server.persistence.remote.repository.UserInfoRepository; 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_USERNAME = "username";
private static final String KEY_PASSWORD = "password"; private static final String KEY_PASSWORD = "password";
private static final String KEY_ENCRYPTION = "encryption";
@Override @Override
public LoginTypeInfo loginType() { public LoginTypeInfo loginType() {
return new LoginTypeInfo() return new LoginTypeInfo()
.setType(POWER_JOB_LOGIN_SERVICE) .setType(POWER_JOB_LOGIN_SERVICE)
.setName("PowerJob's built-in login system") .setName("PowerJob")
; ;
} }
@Override @Override
public String generateLoginUrl(HttpServletRequest httpServletRequest) { public String generateLoginUrl(HttpServletRequest httpServletRequest) {
// 前端实现跳转服务端返回特殊指令 // 前端实现跳转服务端返回特殊指令
return "FE-REDIRECT:PowerJob"; return AuthConstants.FE_REDIRECT_KEY.concat("powerjobLogin");
} }
@Override @Override
@ -57,19 +63,21 @@ public class PowerJobThirdPartyLoginService implements ThirdPartyLoginService {
throw new IllegalArgumentException("can't find login Info"); throw new IllegalArgumentException("can't find login Info");
} }
final Map<String, String> loginInfoMap = SJ.splitKvString(loginInfo); Map<String, Object> loginInfoMap = JsonUtils.parseMap(loginInfo);
final String username = loginInfoMap.get(KEY_USERNAME);
final String password = loginInfoMap.get(KEY_PASSWORD); 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)) { if (StringUtils.isAnyEmpty(username, password)) {
Loggers.WEB.debug("[PowerJobLoginService] username or password is empty, login failed!"); 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<UserInfoDO> userInfoOpt = userInfoRepository.findByUsername(username); final Optional<UserInfoDO> userInfoOpt = userInfoRepository.findByUsername(username);
if (!userInfoOpt.isPresent()) { if (!userInfoOpt.isPresent()) {
Loggers.WEB.debug("[PowerJobLoginService] can't find user by username: {}", username); 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(); final UserInfoDO dbUser = userInfoOpt.get();

View File

@ -141,7 +141,7 @@ public class PowerJobLoginServiceImpl implements PowerJobLoginService {
// headercookie 都能获取 // headercookie 都能获取
String jwtStr = httpServletRequest.getHeader(AuthConstants.JWT_NAME); String jwtStr = httpServletRequest.getHeader(AuthConstants.JWT_NAME);
if (StringUtils.isEmpty(jwtStr)) { 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)) { if (cookie.getName().equals(AuthConstants.JWT_NAME)) {
jwtStr = cookie.getValue(); jwtStr = cookie.getValue();
} }

View File

@ -1,5 +1,7 @@
package tech.powerjob.server.core.service; 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.model.UserInfoDO;
import tech.powerjob.server.persistence.remote.repository.UserInfoRepository; import tech.powerjob.server.persistence.remote.repository.UserInfoRepository;
import com.google.common.base.Splitter; import com.google.common.base.Splitter;
@ -30,8 +32,18 @@ public class UserService {
* @param userInfoDO user * @param userInfoDO user
*/ */
public void save(UserInfoDO userInfoDO) { public void save(UserInfoDO userInfoDO) {
CommonUtils.requireNonNull(userInfoDO.getUsername(), "userName can't be null or empty!");
userInfoDO.setGmtCreate(new Date()); userInfoDO.setGmtCreate(new Date());
userInfoDO.setGmtModified(userInfoDO.getGmtCreate()); userInfoDO.setGmtModified(userInfoDO.getGmtCreate());
// 二次加密密码
final String password = userInfoDO.getPassword();
if (StringUtils.isNotEmpty(password)) {
userInfoDO.setPassword(DigestUtils.rePassword(password, userInfoDO.getUsername()));
}
userInfoRepository.saveAndFlush(userInfoDO); userInfoRepository.saveAndFlush(userInfoDO);
} }

View File

@ -39,6 +39,11 @@ public class NamespaceDO {
private Integer status; private Integer status;
/**
* 标签扩展性之王多值逗号分割
*/
private String tags;
/** /**
* 扩展字段 * 扩展字段
*/ */

View File

@ -67,7 +67,8 @@ public class AuthController {
* @return 登录结果 * @return 登录结果
*/ */
@PostMapping("/thirdPartyLoginDirect") @PostMapping("/thirdPartyLoginDirect")
public ResultDTO<PowerJobUser> selfLogin(LoginRequest loginRequest, HttpServletResponse httpServletResponse) { public ResultDTO<PowerJobUser> selfLogin(@RequestBody LoginRequest loginRequest, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
loginRequest.setHttpServletRequest(httpServletRequest);
try { try {
final PowerJobUser powerJobUser = powerJobLoginService.doLogin(loginRequest); final PowerJobUser powerJobUser = powerJobLoginService.doLogin(loginRequest);
if (powerJobUser == null) { if (powerJobUser == null) {

View File

@ -14,6 +14,7 @@ public class ModifyUserInfoRequest {
private Long id; private Long id;
private String username; private String username;
private String nick;
private String password; private String password;
private String webHook; private String webHook;