diff --git a/blade-auth/src/main/java/org/springblade/auth/granter/IamSsoTokenGranter.java b/blade-auth/src/main/java/org/springblade/auth/granter/IamSsoTokenGranter.java index 1fbacba..fd04d99 100644 --- a/blade-auth/src/main/java/org/springblade/auth/granter/IamSsoTokenGranter.java +++ b/blade-auth/src/main/java/org/springblade/auth/granter/IamSsoTokenGranter.java @@ -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 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 result = userClient.userInfo(request.getTenantId(), accountNo); + if (result.isSuccess() && result.getData() != null) { + return result.getData(); + } + log.info("IAM统一身份认证未匹配到本系统账号,开始自动创建用户,tenantId={}, accountNo={}", request.getTenantId(), accountNo); + R 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 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()); }