diff --git a/powerjob-server/pom.xml b/powerjob-server/pom.xml
index 8883716e..d23b46f1 100644
--- a/powerjob-server/pom.xml
+++ b/powerjob-server/pom.xml
@@ -55,7 +55,6 @@
5.1.0
5.1.0
5.1.0
- 1.6.14
3.17.1
1.12.665
4.4
@@ -308,13 +307,6 @@
${cron-utils.version}
-
-
- org.springdoc
- springdoc-openapi-ui
- ${springdoc-openapi-ui.version}
-
-
diff --git a/powerjob-server/powerjob-server-Infrastructure/src/main/java/tech/powerjob/server/infrastructure/config/ConfigItem.java b/powerjob-server/powerjob-server-Infrastructure/src/main/java/tech/powerjob/server/infrastructure/config/ConfigItem.java
new file mode 100644
index 00000000..31c7e5b5
--- /dev/null
+++ b/powerjob-server/powerjob-server-Infrastructure/src/main/java/tech/powerjob/server/infrastructure/config/ConfigItem.java
@@ -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;
+ }
+}
diff --git a/powerjob-server/powerjob-server-auth/pom.xml b/powerjob-server/powerjob-server-auth/pom.xml
index 7242fdf7..4f15945c 100644
--- a/powerjob-server/powerjob-server-auth/pom.xml
+++ b/powerjob-server/powerjob-server-auth/pom.xml
@@ -28,6 +28,11 @@
powerjob-server-persistence
provided
+
+ tech.powerjob
+ powerjob-server-infrastructure
+ provided
+
io.jsonwebtoken
jjwt-api
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 959eb346..1596d1c1 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
@@ -2,6 +2,7 @@ package tech.powerjob.server.auth.service.login.impl;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
import lombok.Data;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
@@ -10,11 +11,12 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
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.server.auth.LoginUserHolder;
import tech.powerjob.server.auth.PowerJobUser;
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.utils.HttpServletUtils;
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.PowerJobLoginService;
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.repository.UserInfoRepository;
import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.stream.Collectors;
+import java.util.*;
/**
* PowerJob 登录服务
@@ -45,14 +45,17 @@ import java.util.stream.Collectors;
@Service
public class PowerJobLoginServiceImpl implements PowerJobLoginService {
+
private final JwtService jwtService;
+ private final ConfigService configService;
private final UserInfoRepository userInfoRepository;
private final Map code2ThirdPartyLoginService;
@Autowired
- public PowerJobLoginServiceImpl(JwtService jwtService, UserInfoRepository userInfoRepository, List thirdPartyLoginServices) {
+ public PowerJobLoginServiceImpl(JwtService jwtService, ConfigService configService, UserInfoRepository userInfoRepository, List thirdPartyLoginServices) {
this.jwtService = jwtService;
+ this.configService = configService;
this.userInfoRepository = userInfoRepository;
code2ThirdPartyLoginService = Maps.newHashMap();
@@ -64,7 +67,15 @@ public class PowerJobLoginServiceImpl implements PowerJobLoginService {
@Override
public List fetchSupportLoginTypes() {
- return Lists.newArrayList(code2ThirdPartyLoginService.values()).stream().map(ThirdPartyLoginService::loginType).collect(Collectors.toList());
+ Set blacklistLoginTypes = fetchLoginTypeBlackList();
+ List ret = Lists.newArrayList();
+ code2ThirdPartyLoginService.forEach((k ,s) -> {
+ if (blacklistLoginTypes.contains(s.loginType().getType())) {
+ return;
+ }
+ ret.add(s.loginType());
+ });
+ return ret;
}
@Override
@@ -76,6 +87,12 @@ public class PowerJobLoginServiceImpl implements PowerJobLoginService {
@Override
public PowerJobUser doLogin(LoginRequest loginRequest) throws PowerJobAuthException {
final String loginType = loginRequest.getLoginType();
+
+ Set blacklistLoginTypes = fetchLoginTypeBlackList();
+ if (blacklistLoginTypes.contains(loginType)) {
+ throw new PowerJobAuthException(ErrorCodes.INVALID_REQUEST, "LoginTypeInBlackList");
+ }
+
final ThirdPartyLoginService thirdPartyLoginService = fetchBizLoginService(loginType);
ThirdPartyLoginRequest thirdPartyLoginRequest = new ThirdPartyLoginRequest()
@@ -250,6 +267,11 @@ public class PowerJobLoginServiceImpl implements PowerJobLoginService {
return Optional.ofNullable(JsonUtils.parseObject(JsonUtils.toJSONString(jwtBodyMap), JwtBody.class));
}
+ private Set fetchLoginTypeBlackList() {
+ String loginTypeBlackListStr = configService.fetchConfig(ConfigItem.AUTH_LOGIN_TYPE_BLACKLIST.getCode(), null);
+ return Sets.newHashSet(SJ.splitCommaStr2StringList(loginTypeBlackListStr));
+ }
+
@Data
static class JwtBody implements Serializable {
diff --git a/powerjob-server/powerjob-server-common/src/main/java/tech/powerjob/server/common/SJ.java b/powerjob-server/powerjob-server-common/src/main/java/tech/powerjob/server/common/SJ.java
index eb2051a8..4e7ec273 100644
--- a/powerjob-server/powerjob-server-common/src/main/java/tech/powerjob/server/common/SJ.java
+++ b/powerjob-server/powerjob-server-common/src/main/java/tech/powerjob/server/common/SJ.java
@@ -2,7 +2,10 @@ package tech.powerjob.server.common;
import com.google.common.base.Joiner;
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;
/**
@@ -23,4 +26,11 @@ public class SJ {
public static Map splitKvString(String kvString) {
return MAP_SPLITTER.split(kvString);
}
+
+ public static List splitCommaStr2StringList(String str) {
+ if (StringUtils.isEmpty(str)) {
+ return Lists.newArrayList();
+ }
+ return Lists.newArrayList(COMMA_SPLITTER.split(str));
+ }
}
diff --git a/powerjob-server/powerjob-server-common/src/main/java/tech/powerjob/server/common/options/WebOption.java b/powerjob-server/powerjob-server-common/src/main/java/tech/powerjob/server/common/options/WebOption.java
new file mode 100644
index 00000000..2a0167d2
--- /dev/null
+++ b/powerjob-server/powerjob-server-common/src/main/java/tech/powerjob/server/common/options/WebOption.java
@@ -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 List build(Class enumClz) {
+ List 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;
+ }
+
+}
diff --git a/powerjob-server/powerjob-server-common/src/main/java/tech/powerjob/server/common/options/WebOptionAbility.java b/powerjob-server/powerjob-server-common/src/main/java/tech/powerjob/server/common/options/WebOptionAbility.java
new file mode 100644
index 00000000..4fa345e7
--- /dev/null
+++ b/powerjob-server/powerjob-server-common/src/main/java/tech/powerjob/server/common/options/WebOptionAbility.java
@@ -0,0 +1,14 @@
+package tech.powerjob.server.common.options;
+
+/**
+ * 具备成为选项的能力
+ *
+ * @author tjq
+ * @since 2024/8/24
+ */
+public interface WebOptionAbility {
+
+ String getCode();
+
+ String getLabel();
+}
diff --git a/powerjob-server/powerjob-server-core/pom.xml b/powerjob-server/powerjob-server-core/pom.xml
index 11b81f55..ab6e3c83 100644
--- a/powerjob-server/powerjob-server-core/pom.xml
+++ b/powerjob-server/powerjob-server-core/pom.xml
@@ -35,6 +35,11 @@
tech.powerjob
powerjob-server-persistence
+
+ tech.powerjob
+ powerjob-server-infrastructure
+ provided
+
\ No newline at end of file
diff --git a/powerjob-server/powerjob-server-starter/pom.xml b/powerjob-server/powerjob-server-starter/pom.xml
index 8a9dd15a..7f2dcc7e 100644
--- a/powerjob-server/powerjob-server-starter/pom.xml
+++ b/powerjob-server/powerjob-server-starter/pom.xml
@@ -16,9 +16,19 @@
8
8
+
+ 1.6.14
+
+
+
+ org.springdoc
+ springdoc-openapi-ui
+ ${springdoc-openapi-ui.version}
+
+
tech.powerjob
powerjob-server-extension
@@ -39,6 +49,10 @@
tech.powerjob
powerjob-server-persistence
+
+ tech.powerjob
+ powerjob-server-infrastructure
+
tech.powerjob
powerjob-server-core
diff --git a/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/SystemConfigController.java b/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/SystemConfigController.java
new file mode 100644
index 00000000..cea6ae88
--- /dev/null
+++ b/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/SystemConfigController.java
@@ -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 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> listConfig() {
+ return ResultDTO.success(dynamicServerConfigCrudService.list());
+ }
+
+ @GetMapping("/configItemOptions")
+ @ApiPermission(name = "Config-ConfigItemOptions", roleScope = RoleScope.GLOBAL, requiredPermission = Permission.SU)
+ public ResultDTO> configItemOptions() {
+ return ResultDTO.success(WebOption.build(ConfigItem.class));
+ }
+
+ @DeleteMapping("/delete")
+ @ApiPermission(name = "Config-Delete", roleScope = RoleScope.GLOBAL, requiredPermission = Permission.SU)
+ public ResultDTO deleteNamespace(String key) {
+ dynamicServerConfigCrudService.delete(key);
+ return ResultDTO.success(null);
+ }
+}