mirror of
https://github.com/PowerJob/PowerJob.git
synced 2025-07-17 00:00:04 +08:00
feat: dynamic server config #969
This commit is contained in:
parent
9b35af9b44
commit
0fce33afc5
@ -55,7 +55,6 @@
|
|||||||
<powerjob-common.version>5.1.0</powerjob-common.version>
|
<powerjob-common.version>5.1.0</powerjob-common.version>
|
||||||
<powerjob-remote-impl-http.version>5.1.0</powerjob-remote-impl-http.version>
|
<powerjob-remote-impl-http.version>5.1.0</powerjob-remote-impl-http.version>
|
||||||
<powerjob-remote-impl-akka.version>5.1.0</powerjob-remote-impl-akka.version>
|
<powerjob-remote-impl-akka.version>5.1.0</powerjob-remote-impl-akka.version>
|
||||||
<springdoc-openapi-ui.version>1.6.14</springdoc-openapi-ui.version>
|
|
||||||
<aliyun-sdk-oss.version>3.17.1</aliyun-sdk-oss.version>
|
<aliyun-sdk-oss.version>3.17.1</aliyun-sdk-oss.version>
|
||||||
<aws-java-sdk-s3.version>1.12.665</aws-java-sdk-s3.version>
|
<aws-java-sdk-s3.version>1.12.665</aws-java-sdk-s3.version>
|
||||||
<commons-collections4.version>4.4</commons-collections4.version>
|
<commons-collections4.version>4.4</commons-collections4.version>
|
||||||
@ -308,13 +307,6 @@
|
|||||||
<version>${cron-utils.version}</version>
|
<version>${cron-utils.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- OPEN API -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springdoc</groupId>
|
|
||||||
<artifactId>springdoc-openapi-ui</artifactId>
|
|
||||||
<version>${springdoc-openapi-ui.version}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
|
|
||||||
<!-- https://mvnrepository.com/artifact/org.codehaus.groovy/groovy-jsr223 -->
|
<!-- https://mvnrepository.com/artifact/org.codehaus.groovy/groovy-jsr223 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -0,0 +1,32 @@
|
|||||||
|
package tech.powerjob.server.infrastructure.config;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import tech.powerjob.server.common.options.WebOptionAbility;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 支持的配置项
|
||||||
|
*
|
||||||
|
* @author tjq
|
||||||
|
* @since 2024/8/24
|
||||||
|
*/
|
||||||
|
@AllArgsConstructor
|
||||||
|
public enum ConfigItem implements WebOptionAbility {
|
||||||
|
|
||||||
|
AUTH_LOGIN_TYPE_BLACKLIST("oms.auth.login-type.blacklist", "禁用的登录方式")
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
private final String code;
|
||||||
|
|
||||||
|
private final String desc;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCode() {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getLabel() {
|
||||||
|
return desc;
|
||||||
|
}
|
||||||
|
}
|
@ -28,6 +28,11 @@
|
|||||||
<artifactId>powerjob-server-persistence</artifactId>
|
<artifactId>powerjob-server-persistence</artifactId>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>tech.powerjob</groupId>
|
||||||
|
<artifactId>powerjob-server-infrastructure</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.jsonwebtoken</groupId>
|
<groupId>io.jsonwebtoken</groupId>
|
||||||
<artifactId>jjwt-api</artifactId>
|
<artifactId>jjwt-api</artifactId>
|
||||||
|
@ -2,6 +2,7 @@ package tech.powerjob.server.auth.service.login.impl;
|
|||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@ -10,11 +11,12 @@ import org.apache.commons.lang3.StringUtils;
|
|||||||
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.BeanUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import tech.powerjob.common.enums.ErrorCodes;
|
||||||
|
import tech.powerjob.common.enums.SwitchableStatus;
|
||||||
import tech.powerjob.common.serialize.JsonUtils;
|
import tech.powerjob.common.serialize.JsonUtils;
|
||||||
import tech.powerjob.server.auth.LoginUserHolder;
|
import tech.powerjob.server.auth.LoginUserHolder;
|
||||||
import tech.powerjob.server.auth.PowerJobUser;
|
import tech.powerjob.server.auth.PowerJobUser;
|
||||||
import tech.powerjob.server.auth.common.AuthConstants;
|
import tech.powerjob.server.auth.common.AuthConstants;
|
||||||
import tech.powerjob.common.enums.ErrorCodes;
|
|
||||||
import tech.powerjob.server.auth.common.PowerJobAuthException;
|
import tech.powerjob.server.auth.common.PowerJobAuthException;
|
||||||
import tech.powerjob.server.auth.common.utils.HttpServletUtils;
|
import tech.powerjob.server.auth.common.utils.HttpServletUtils;
|
||||||
import tech.powerjob.server.auth.jwt.JwtService;
|
import tech.powerjob.server.auth.jwt.JwtService;
|
||||||
@ -23,17 +25,15 @@ import tech.powerjob.server.auth.login.*;
|
|||||||
import tech.powerjob.server.auth.service.login.LoginRequest;
|
import tech.powerjob.server.auth.service.login.LoginRequest;
|
||||||
import tech.powerjob.server.auth.service.login.PowerJobLoginService;
|
import tech.powerjob.server.auth.service.login.PowerJobLoginService;
|
||||||
import tech.powerjob.server.common.Loggers;
|
import tech.powerjob.server.common.Loggers;
|
||||||
import tech.powerjob.common.enums.SwitchableStatus;
|
import tech.powerjob.server.common.SJ;
|
||||||
|
import tech.powerjob.server.infrastructure.config.ConfigItem;
|
||||||
|
import tech.powerjob.server.infrastructure.config.ConfigService;
|
||||||
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 javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Date;
|
import java.util.*;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PowerJob 登录服务
|
* PowerJob 登录服务
|
||||||
@ -45,14 +45,17 @@ import java.util.stream.Collectors;
|
|||||||
@Service
|
@Service
|
||||||
public class PowerJobLoginServiceImpl implements PowerJobLoginService {
|
public class PowerJobLoginServiceImpl implements PowerJobLoginService {
|
||||||
|
|
||||||
|
|
||||||
private final JwtService jwtService;
|
private final JwtService jwtService;
|
||||||
|
private final ConfigService configService;
|
||||||
private final UserInfoRepository userInfoRepository;
|
private final UserInfoRepository userInfoRepository;
|
||||||
private final Map<String, ThirdPartyLoginService> code2ThirdPartyLoginService;
|
private final Map<String, ThirdPartyLoginService> code2ThirdPartyLoginService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public PowerJobLoginServiceImpl(JwtService jwtService, UserInfoRepository userInfoRepository, List<ThirdPartyLoginService> thirdPartyLoginServices) {
|
public PowerJobLoginServiceImpl(JwtService jwtService, ConfigService configService, UserInfoRepository userInfoRepository, List<ThirdPartyLoginService> thirdPartyLoginServices) {
|
||||||
|
|
||||||
this.jwtService = jwtService;
|
this.jwtService = jwtService;
|
||||||
|
this.configService = configService;
|
||||||
this.userInfoRepository = userInfoRepository;
|
this.userInfoRepository = userInfoRepository;
|
||||||
|
|
||||||
code2ThirdPartyLoginService = Maps.newHashMap();
|
code2ThirdPartyLoginService = Maps.newHashMap();
|
||||||
@ -64,7 +67,15 @@ public class PowerJobLoginServiceImpl implements PowerJobLoginService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<LoginTypeInfo> fetchSupportLoginTypes() {
|
public List<LoginTypeInfo> fetchSupportLoginTypes() {
|
||||||
return Lists.newArrayList(code2ThirdPartyLoginService.values()).stream().map(ThirdPartyLoginService::loginType).collect(Collectors.toList());
|
Set<String> blacklistLoginTypes = fetchLoginTypeBlackList();
|
||||||
|
List<LoginTypeInfo> ret = Lists.newArrayList();
|
||||||
|
code2ThirdPartyLoginService.forEach((k ,s) -> {
|
||||||
|
if (blacklistLoginTypes.contains(s.loginType().getType())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ret.add(s.loginType());
|
||||||
|
});
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -76,6 +87,12 @@ public class PowerJobLoginServiceImpl implements PowerJobLoginService {
|
|||||||
@Override
|
@Override
|
||||||
public PowerJobUser doLogin(LoginRequest loginRequest) throws PowerJobAuthException {
|
public PowerJobUser doLogin(LoginRequest loginRequest) throws PowerJobAuthException {
|
||||||
final String loginType = loginRequest.getLoginType();
|
final String loginType = loginRequest.getLoginType();
|
||||||
|
|
||||||
|
Set<String> blacklistLoginTypes = fetchLoginTypeBlackList();
|
||||||
|
if (blacklistLoginTypes.contains(loginType)) {
|
||||||
|
throw new PowerJobAuthException(ErrorCodes.INVALID_REQUEST, "LoginTypeInBlackList");
|
||||||
|
}
|
||||||
|
|
||||||
final ThirdPartyLoginService thirdPartyLoginService = fetchBizLoginService(loginType);
|
final ThirdPartyLoginService thirdPartyLoginService = fetchBizLoginService(loginType);
|
||||||
|
|
||||||
ThirdPartyLoginRequest thirdPartyLoginRequest = new ThirdPartyLoginRequest()
|
ThirdPartyLoginRequest thirdPartyLoginRequest = new ThirdPartyLoginRequest()
|
||||||
@ -250,6 +267,11 @@ public class PowerJobLoginServiceImpl implements PowerJobLoginService {
|
|||||||
return Optional.ofNullable(JsonUtils.parseObject(JsonUtils.toJSONString(jwtBodyMap), JwtBody.class));
|
return Optional.ofNullable(JsonUtils.parseObject(JsonUtils.toJSONString(jwtBodyMap), JwtBody.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Set<String> fetchLoginTypeBlackList() {
|
||||||
|
String loginTypeBlackListStr = configService.fetchConfig(ConfigItem.AUTH_LOGIN_TYPE_BLACKLIST.getCode(), null);
|
||||||
|
return Sets.newHashSet(SJ.splitCommaStr2StringList(loginTypeBlackListStr));
|
||||||
|
}
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
static class JwtBody implements Serializable {
|
static class JwtBody implements Serializable {
|
||||||
|
|
||||||
|
@ -2,7 +2,10 @@ package tech.powerjob.server.common;
|
|||||||
|
|
||||||
import com.google.common.base.Joiner;
|
import com.google.common.base.Joiner;
|
||||||
import com.google.common.base.Splitter;
|
import com.google.common.base.Splitter;
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -23,4 +26,11 @@ public class SJ {
|
|||||||
public static Map<String, String> splitKvString(String kvString) {
|
public static Map<String, String> splitKvString(String kvString) {
|
||||||
return MAP_SPLITTER.split(kvString);
|
return MAP_SPLITTER.split(kvString);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static List<String> splitCommaStr2StringList(String str) {
|
||||||
|
if (StringUtils.isEmpty(str)) {
|
||||||
|
return Lists.newArrayList();
|
||||||
|
}
|
||||||
|
return Lists.newArrayList(COMMA_SPLITTER.split(str));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,41 @@
|
|||||||
|
package tech.powerjob.server.common.options;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通用选项,对应前端的下拉框组件
|
||||||
|
*
|
||||||
|
* @author tjq
|
||||||
|
* @since 2024/8/24
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class WebOption implements Serializable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 选项值
|
||||||
|
*/
|
||||||
|
private String code;
|
||||||
|
/**
|
||||||
|
* 选项暂时内容(默认中文,i18n 问题此处暂不考虑)
|
||||||
|
*/
|
||||||
|
private String label;
|
||||||
|
|
||||||
|
public static <T extends WebOptionAbility> List<WebOption> build(Class<T> enumClz) {
|
||||||
|
List<WebOption> ret = Lists.newArrayList();
|
||||||
|
T[] enumConstants = enumClz.getEnumConstants();
|
||||||
|
for (T enumConstant : enumConstants) {
|
||||||
|
WebOption webOption = new WebOption()
|
||||||
|
.setCode(enumConstant.getCode())
|
||||||
|
.setLabel(enumConstant.getLabel());
|
||||||
|
ret.add(webOption);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
package tech.powerjob.server.common.options;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 具备成为选项的能力
|
||||||
|
*
|
||||||
|
* @author tjq
|
||||||
|
* @since 2024/8/24
|
||||||
|
*/
|
||||||
|
public interface WebOptionAbility {
|
||||||
|
|
||||||
|
String getCode();
|
||||||
|
|
||||||
|
String getLabel();
|
||||||
|
}
|
@ -35,6 +35,11 @@
|
|||||||
<groupId>tech.powerjob</groupId>
|
<groupId>tech.powerjob</groupId>
|
||||||
<artifactId>powerjob-server-persistence</artifactId>
|
<artifactId>powerjob-server-persistence</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>tech.powerjob</groupId>
|
||||||
|
<artifactId>powerjob-server-infrastructure</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
@ -16,9 +16,19 @@
|
|||||||
<properties>
|
<properties>
|
||||||
<maven.compiler.source>8</maven.compiler.source>
|
<maven.compiler.source>8</maven.compiler.source>
|
||||||
<maven.compiler.target>8</maven.compiler.target>
|
<maven.compiler.target>8</maven.compiler.target>
|
||||||
|
|
||||||
|
<springdoc-openapi-ui.version>1.6.14</springdoc-openapi-ui.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
|
||||||
|
<!-- OPEN API -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springdoc</groupId>
|
||||||
|
<artifactId>springdoc-openapi-ui</artifactId>
|
||||||
|
<version>${springdoc-openapi-ui.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>tech.powerjob</groupId>
|
<groupId>tech.powerjob</groupId>
|
||||||
<artifactId>powerjob-server-extension</artifactId>
|
<artifactId>powerjob-server-extension</artifactId>
|
||||||
@ -39,6 +49,10 @@
|
|||||||
<groupId>tech.powerjob</groupId>
|
<groupId>tech.powerjob</groupId>
|
||||||
<artifactId>powerjob-server-persistence</artifactId>
|
<artifactId>powerjob-server-persistence</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>tech.powerjob</groupId>
|
||||||
|
<artifactId>powerjob-server-infrastructure</artifactId>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>tech.powerjob</groupId>
|
<groupId>tech.powerjob</groupId>
|
||||||
<artifactId>powerjob-server-core</artifactId>
|
<artifactId>powerjob-server-core</artifactId>
|
||||||
|
@ -0,0 +1,56 @@
|
|||||||
|
package tech.powerjob.server.web.controller;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
import tech.powerjob.common.response.ResultDTO;
|
||||||
|
import tech.powerjob.server.auth.Permission;
|
||||||
|
import tech.powerjob.server.auth.RoleScope;
|
||||||
|
import tech.powerjob.server.auth.interceptor.ApiPermission;
|
||||||
|
import tech.powerjob.server.common.options.WebOption;
|
||||||
|
import tech.powerjob.server.infrastructure.config.Config;
|
||||||
|
import tech.powerjob.server.infrastructure.config.ConfigItem;
|
||||||
|
import tech.powerjob.server.infrastructure.config.DynamicServerConfigCrudService;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系统设置 controller
|
||||||
|
*
|
||||||
|
* @author tjq
|
||||||
|
* @since 2024/8/24
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@RestController
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@RequestMapping("/config")
|
||||||
|
public class SystemConfigController {
|
||||||
|
|
||||||
|
private final DynamicServerConfigCrudService dynamicServerConfigCrudService;
|
||||||
|
|
||||||
|
@PostMapping("/save")
|
||||||
|
@ApiPermission(name = "Config-Save", roleScope = RoleScope.GLOBAL, requiredPermission = Permission.SU)
|
||||||
|
public ResultDTO<Void> saveConfig(@RequestBody Config config) {
|
||||||
|
dynamicServerConfigCrudService.save(config);
|
||||||
|
return ResultDTO.success(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/list")
|
||||||
|
@ApiPermission(name = "Config-List", roleScope = RoleScope.GLOBAL, requiredPermission = Permission.SU)
|
||||||
|
public ResultDTO<List<Config>> listConfig() {
|
||||||
|
return ResultDTO.success(dynamicServerConfigCrudService.list());
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/configItemOptions")
|
||||||
|
@ApiPermission(name = "Config-ConfigItemOptions", roleScope = RoleScope.GLOBAL, requiredPermission = Permission.SU)
|
||||||
|
public ResultDTO<List<WebOption>> configItemOptions() {
|
||||||
|
return ResultDTO.success(WebOption.build(ConfigItem.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
@DeleteMapping("/delete")
|
||||||
|
@ApiPermission(name = "Config-Delete", roleScope = RoleScope.GLOBAL, requiredPermission = Permission.SU)
|
||||||
|
public ResultDTO<Void> deleteNamespace(String key) {
|
||||||
|
dynamicServerConfigCrudService.delete(key);
|
||||||
|
return ResultDTO.success(null);
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user