IAM对接调试

This commit is contained in:
2026-07-15 21:56:14 +08:00
parent 235e032f80
commit 5860040bcf

View File

@@ -31,6 +31,7 @@ import org.springblade.auth.dto.IamSsoProfileResponse;
import org.springblade.auth.dto.IamSsoTokenResponse;
import org.springblade.auth.props.IamSsoProperties;
import org.springblade.auth.utils.TokenUtil;
import org.springblade.core.mp.enums.StatusType;
import org.springblade.core.oauth2.constant.OAuth2TokenConstant;
import org.springblade.core.oauth2.exception.UserInvalidException;
import org.springblade.core.oauth2.granter.AuthorizationCodeGranter;
@@ -42,8 +43,11 @@ import org.springblade.core.oauth2.service.OAuth2UserService;
import org.springblade.core.redis.cache.BladeRedis;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.StringUtil;
import org.springblade.core.tool.utils.StringPool;
import org.springblade.system.feign.IUserClient;
import org.springblade.system.pojo.entity.User;
import org.springblade.system.pojo.entity.UserInfo;
import org.springblade.system.pojo.enums.UserType;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpHeaders;
@@ -118,13 +122,8 @@ public class IamSsoTokenGranter extends AuthorizationCodeGranter {
throw new UserInvalidException(OAuth2TokenConstant.USER_NOT_FOUND);
}
R<UserInfo> result = userClient.userInfo(request.getTenantId(), accountNo);
if (!result.isSuccess() || result.getData() == null) {
log.warn("IAM统一身份认证未匹配到本系统账号tenantId={}, accountNo={}", request.getTenantId(), accountNo);
throw new UserInvalidException(OAuth2TokenConstant.USER_NOT_FOUND);
}
OAuth2User user = TokenUtil.convertUser(result.getData(), request);
UserInfo userInfo = loadOrCreateIamUser(request, profileResponse, accountNo);
OAuth2User user = TokenUtil.convertUser(userInfo, request);
if (user == null) {
throw new UserInvalidException(OAuth2TokenConstant.USER_NOT_FOUND);
}
@@ -132,6 +131,41 @@ public class IamSsoTokenGranter extends AuthorizationCodeGranter {
return user;
}
private UserInfo loadOrCreateIamUser(OAuth2Request request, IamSsoProfileResponse profileResponse, String accountNo) {
R<UserInfo> result = userClient.userInfo(request.getTenantId(), accountNo);
if (result.isSuccess() && result.getData() != null) {
return result.getData();
}
log.info("IAM统一身份认证未匹配到本系统账号开始自动创建用户tenantId={}, accountNo={}", request.getTenantId(), accountNo);
R<Boolean> saveResult = userClient.saveUser(buildIamUser(request, profileResponse, accountNo));
if (!saveResult.isSuccess() || !Boolean.TRUE.equals(saveResult.getData())) {
log.warn("IAM统一身份认证自动创建用户失败tenantId={}, accountNo={}, msg={}", request.getTenantId(), accountNo, saveResult.getMsg());
throw new UserInvalidException(OAuth2TokenConstant.USER_NOT_FOUND);
}
R<UserInfo> createdResult = userClient.userInfo(request.getTenantId(), accountNo);
if (!createdResult.isSuccess() || createdResult.getData() == null) {
log.warn("IAM统一身份认证自动创建用户后未查询到用户tenantId={}, accountNo={}", request.getTenantId(), accountNo);
throw new UserInvalidException(OAuth2TokenConstant.USER_NOT_FOUND);
}
return createdResult.getData();
}
private User buildIamUser(OAuth2Request request, IamSsoProfileResponse profileResponse, String accountNo) {
User user = new User();
user.setTenantId(request.getTenantId());
user.setUserType(UserType.WEB.getCategory());
user.setAccount(accountNo);
user.setPassword(accountNo);
user.setName(accountNo);
user.setRealName(accountNo);
user.setRoleId(StringPool.MINUS_ONE);
user.setDeptId(StringPool.MINUS_ONE);
user.setPostId(StringPool.MINUS_ONE);
user.setStatus(StatusType.ACTIVE.getType());
log.info("IAM统一身份认证自动创建用户参数tenantId={}, accountNo={}, iamId={}", request.getTenantId(), accountNo, profileResponse.getId());
return user;
}
private boolean isIamRequest(OAuth2Request request) {
return StringUtil.isNotBlank(properties.getRedirectUri()) && StringUtil.equals(properties.getRedirectUri(), request.getRedirectUri());
}