From 3363628b7de86c6bdc53f43ec6bbce1d22e2997d Mon Sep 17 00:00:00 2001
From: b2894lxlx <517289602@qq.com>
Date: Thu, 16 Jul 2026 11:39:53 +0800
Subject: [PATCH] fix bug
---
.../granter/IamAwareTokenGranterFactory.java | 143 ++++++++++++++++++
1 file changed, 143 insertions(+)
create mode 100644 blade-auth/src/main/java/org/springblade/auth/granter/IamAwareTokenGranterFactory.java
diff --git a/blade-auth/src/main/java/org/springblade/auth/granter/IamAwareTokenGranterFactory.java b/blade-auth/src/main/java/org/springblade/auth/granter/IamAwareTokenGranterFactory.java
new file mode 100644
index 0000000..c6bce66
--- /dev/null
+++ b/blade-auth/src/main/java/org/springblade/auth/granter/IamAwareTokenGranterFactory.java
@@ -0,0 +1,143 @@
+/**
+ * BladeX Commercial License Agreement
+ * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
+ *
+ * Use of this software is governed by the Commercial License Agreement
+ * obtained after purchasing a license from BladeX.
+ *
+ * 1. This software is for development use only under a valid license
+ * from BladeX.
+ *
+ * 2. Redistribution of this software's source code to any third party
+ * without a commercial license is strictly prohibited.
+ *
+ * 3. Licensees may copyright their own code but cannot use segments
+ * from this software for such purposes. Copyright of this software
+ * remains with BladeX.
+ *
+ * Using this software signifies agreement to this License, and the software
+ * must not be used for illegal purposes.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
+ * not liable for any claims arising from secondary or illegal development.
+ *
+ * Author: Chill Zhuang (bladejava@qq.com)
+ */
+package org.springblade.auth.granter;
+
+import org.springblade.core.oauth2.granter.TokenGranter;
+import org.springblade.core.oauth2.granter.TokenGranterEnhancer;
+import org.springblade.core.oauth2.granter.TokenGranterFactory;
+import org.springblade.core.oauth2.props.OAuth2Properties;
+import org.springblade.core.oauth2.provider.OAuth2Request;
+import org.springblade.core.oauth2.provider.OAuth2Token;
+import org.springblade.core.oauth2.service.OAuth2Client;
+import org.springblade.core.oauth2.service.OAuth2User;
+
+import java.util.List;
+
+/**
+ * IAM统一身份认证授权器工厂
+ *
+ * @author Chill
+ */
+public class IamAwareTokenGranterFactory extends TokenGranterFactory {
+
+ private static final String AUTHORIZATION_CODE = "authorization_code";
+ private static final String IAM_SSO = "iam_sso";
+
+ private final IamSsoTokenGranter iamSsoTokenGranter;
+ private final TokenGranter authorizationCodeGranter;
+ private final List tokenGranterEnhancers;
+
+ public IamAwareTokenGranterFactory(List tokenGranters,
+ List tokenGranterEnhancers,
+ OAuth2Properties properties) {
+ super(tokenGranters, tokenGranterEnhancers, properties);
+ this.iamSsoTokenGranter = tokenGranters.stream()
+ .filter(IamSsoTokenGranter.class::isInstance)
+ .map(IamSsoTokenGranter.class::cast)
+ .findFirst()
+ .orElse(null);
+ this.authorizationCodeGranter = tokenGranters.stream()
+ .filter(tokenGranter -> AUTHORIZATION_CODE.equals(tokenGranter.type()))
+ .filter(tokenGranter -> !(tokenGranter instanceof IamSsoTokenGranter))
+ .findFirst()
+ .orElse(null);
+ this.tokenGranterEnhancers = tokenGranterEnhancers;
+ }
+
+ @Override
+ public TokenGranter create(String grantType) {
+ if (IAM_SSO.equals(grantType) && iamSsoTokenGranter != null) {
+ applyEnhancer(grantType, iamSsoTokenGranter);
+ return iamSsoTokenGranter;
+ }
+ if (AUTHORIZATION_CODE.equals(grantType) && iamSsoTokenGranter != null && authorizationCodeGranter != null) {
+ applyEnhancer(grantType, authorizationCodeGranter);
+ applyEnhancer(IAM_SSO, iamSsoTokenGranter);
+ return new IamAwareAuthorizationCodeGranter(iamSsoTokenGranter, authorizationCodeGranter);
+ }
+ return super.create(grantType);
+ }
+
+ private void applyEnhancer(String grantType, TokenGranter tokenGranter) {
+ tokenGranterEnhancers.stream()
+ .filter(enhancer -> grantType.equals(enhancer.type()))
+ .findFirst()
+ .ifPresent(tokenGranter::enhancer);
+ }
+
+ /**
+ * IAM授权码与本系统授权码分流
+ *
+ * @author Chill
+ */
+ private static class IamAwareAuthorizationCodeGranter implements TokenGranter {
+
+ private final IamSsoTokenGranter iamSsoTokenGranter;
+ private final TokenGranter authorizationCodeGranter;
+ private final ThreadLocal currentGranter = new ThreadLocal<>();
+
+ private IamAwareAuthorizationCodeGranter(IamSsoTokenGranter iamSsoTokenGranter, TokenGranter authorizationCodeGranter) {
+ this.iamSsoTokenGranter = iamSsoTokenGranter;
+ this.authorizationCodeGranter = authorizationCodeGranter;
+ }
+
+ @Override
+ public String type() {
+ return AUTHORIZATION_CODE;
+ }
+
+ @Override
+ public OAuth2Client client(OAuth2Request request) {
+ return resolveGranter(request).client(request);
+ }
+
+ @Override
+ public OAuth2User user(OAuth2Request request) {
+ TokenGranter tokenGranter = resolveGranter(request);
+ currentGranter.set(tokenGranter);
+ return tokenGranter.user(request);
+ }
+
+ @Override
+ public OAuth2Token token(OAuth2User user, OAuth2Request request) {
+ try {
+ return currentGranter.get().token(user, request);
+ } finally {
+ currentGranter.remove();
+ }
+ }
+
+ @Override
+ public void enhancer(TokenGranterEnhancer enhancer) {
+ authorizationCodeGranter.enhancer(enhancer);
+ }
+
+ private TokenGranter resolveGranter(OAuth2Request request) {
+ return iamSsoTokenGranter.supports(request) ? iamSsoTokenGranter : authorizationCodeGranter;
+ }
+ }
+
+}