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); + } +}