diff --git a/blade-auth/pom.xml b/blade-auth/pom.xml index 3f8f7fc..3799e81 100644 --- a/blade-auth/pom.xml +++ b/blade-auth/pom.xml @@ -63,6 +63,10 @@ org.springblade blade-system-api + + org.springblade + blade-mk-api + org.springblade blade-resource-api diff --git a/blade-auth/src/main/java/org/springblade/auth/endpoint/OAuth2MKEndpoint.java b/blade-auth/src/main/java/org/springblade/auth/endpoint/OAuth2MKEndpoint.java new file mode 100644 index 0000000..b38eff2 --- /dev/null +++ b/blade-auth/src/main/java/org/springblade/auth/endpoint/OAuth2MKEndpoint.java @@ -0,0 +1,68 @@ +package org.springblade.auth.endpoint; + +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.oauth2.endpoint.AbstractOAuth2MKEndpoint; +import org.springblade.core.oauth2.granter.TokenGranterFactory; +import org.springblade.core.oauth2.handler.TokenHandler; +import org.springblade.core.tool.utils.StringUtil; +import org.springblade.core.tool.utils.UrlUtil; +import org.springblade.thirdparty.mk.config.MKProperties; +import org.springblade.thirdparty.mk.service.IMKService; +import org.springframework.web.bind.annotation.RestController; + +import java.util.stream.Stream; + +/** + * @author bfhuange + * @date 2024/9/17 + */ +@RestController +@Slf4j +@Tag(name = "跳转mk认证", description = "跳转mk认证端点") +public class OAuth2MKEndpoint extends AbstractOAuth2MKEndpoint { + /** + * 登录链接 + */ + private static final String LOGIN_URL_FORMAT = "%s%s?appId=%s&redirection_url=%s"; + + private final MKProperties mkProperties; + private final IMKService mkService; + + public OAuth2MKEndpoint(TokenGranterFactory granterFactory, TokenHandler tokenHandler, MKProperties mkProperties, IMKService mkService) { + super(granterFactory, tokenHandler); + this.mkProperties = mkProperties; + this.mkService = mkService; + } + + @Override + protected String generateLoginUrl(String refererUrl) { + // 重定向到来源 + return String.format(LOGIN_URL_FORMAT, mkProperties.getLoginUrl(), mkProperties.getMkSsoLoginUrl(), mkProperties.getOauthAppId(), UrlUtil.encode(refererUrl)); + } + + @Override + protected String getAccountByMkCode(String mkCode) { + return mkService.getMKAccount(mkCode); + } + + @Override + protected boolean checkRefererUrl(String refererUrl) { + if (!mkProperties.isCheckReferer()) { + // 未开启校验来源,校验通过 + return true; + } + if (StringUtil.isBlank(mkProperties.getErpBaseUrls())) { + log.error("未配置erp地址,无法校验来源"); + return false; + } + if (StringUtil.isBlank(refererUrl)) { + // 来源地址为空,通过,以便用于调试 + return true; + } + // 匹配到一个erp基础地址就行了 + return Stream.of(mkProperties.getErpBaseUrls().split(",")) + .map(String::trim) + .anyMatch(refererUrl::startsWith); + } +} diff --git a/blade-auth/src/main/java/org/springblade/auth/exception/OAuth2MKExceptionHandler.java b/blade-auth/src/main/java/org/springblade/auth/exception/OAuth2MKExceptionHandler.java new file mode 100644 index 0000000..7ee4962 --- /dev/null +++ b/blade-auth/src/main/java/org/springblade/auth/exception/OAuth2MKExceptionHandler.java @@ -0,0 +1,13 @@ +package org.springblade.auth.exception; + +import org.springblade.auth.endpoint.OAuth2MKEndpoint; +import org.springblade.core.oauth2.exception.OAuth2ExceptionHandler; +import org.springframework.web.bind.annotation.ControllerAdvice; + +/** + * @author bfhuange + * @date 2024/10/16 + */ +@ControllerAdvice(basePackageClasses = OAuth2MKEndpoint.class) +public class OAuth2MKExceptionHandler extends OAuth2ExceptionHandler { +} diff --git a/blade-auth/src/main/resources/application.yml b/blade-auth/src/main/resources/application.yml index d81e0c6..c677b13 100644 --- a/blade-auth/src/main/resources/application.yml +++ b/blade-auth/src/main/resources/application.yml @@ -8,6 +8,7 @@ spring: import: - nacos:blade.yaml?group=DEFAULT_GROUP&refreshEnabled=true - nacos:blade-${spring.profiles.active}.yaml?group=DEFAULT_GROUP&refreshEnabled=true + - nacos:third-party-api.yaml?group=DEFAULT_GROUP&refreshEnabled=true - optional:nacos:${spring.application.name}-${spring.profiles.active}.yaml?group=DEFAULT_GROUP&refreshEnabled=true cloud: nacos: