diff --git a/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/controller/SalesforceAuthController.java b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/controller/SalesforceAuthController.java new file mode 100644 index 00000000..053b43de --- /dev/null +++ b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/controller/SalesforceAuthController.java @@ -0,0 +1,52 @@ +package com.datai.salesforceauth.controller; + +import com.datai.common.core.domain.AjaxResult; +import com.datai.salesforceauth.model.dto.LoginRequest; +import com.datai.salesforceauth.model.dto.LogoutRequest; +import com.datai.salesforceauth.model.dto.RefreshTokenRequest; +import com.datai.salesforceauth.model.vo.LoginResponse; +import com.datai.salesforceauth.model.vo.LoginTypeVo; +import com.datai.salesforceauth.service.ISalesforceAuthService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/salesforce/auth") +@Tag(name = "【Salesforce 认证】管理") +public class SalesforceAuthController { + + @Autowired + private ISalesforceAuthService salesforceAuthService; + + @Operation(summary = "登录") + @PostMapping("/login") + public AjaxResult login(@RequestBody LoginRequest request) { + LoginResponse response = salesforceAuthService.login(request); + return AjaxResult.success(response); + } + + @Operation(summary = "刷新令牌") + @PostMapping("/refresh-token") + public AjaxResult refreshToken(@RequestBody RefreshTokenRequest request) { + LoginResponse response = salesforceAuthService.refreshToken(request); + return AjaxResult.success(response); + } + + @Operation(summary = "登出") + @PostMapping("/logout") + public AjaxResult logout(@RequestBody LogoutRequest request) { + salesforceAuthService.logout(request); + return AjaxResult.success(); + } + + @Operation(summary = "获取支持的登录类型") + @GetMapping("/login-types") + public AjaxResult getSupportedLoginTypes() { + List loginTypes = salesforceAuthService.getSupportedLoginTypes(); + return AjaxResult.success(loginTypes); + } +} diff --git a/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/exception/LoginException.java b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/exception/LoginException.java new file mode 100644 index 00000000..68320cae --- /dev/null +++ b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/exception/LoginException.java @@ -0,0 +1,28 @@ +package com.datai.salesforceauth.exception; + +public class LoginException extends RuntimeException { + + private String errorCode; + + public LoginException(String message) { + super(message); + } + + public LoginException(String errorCode, String message) { + super(message); + this.errorCode = errorCode; + } + + public LoginException(String message, Throwable cause) { + super(message, cause); + } + + public LoginException(String errorCode, String message, Throwable cause) { + super(message, cause); + this.errorCode = errorCode; + } + + public String getErrorCode() { + return errorCode; + } +} diff --git a/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/exception/RefreshTokenException.java b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/exception/RefreshTokenException.java new file mode 100644 index 00000000..ae6f6046 --- /dev/null +++ b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/exception/RefreshTokenException.java @@ -0,0 +1,28 @@ +package com.datai.salesforceauth.exception; + +public class RefreshTokenException extends RuntimeException { + + private String errorCode; + + public RefreshTokenException(String message) { + super(message); + } + + public RefreshTokenException(String errorCode, String message) { + super(message); + this.errorCode = errorCode; + } + + public RefreshTokenException(String message, Throwable cause) { + super(message, cause); + } + + public RefreshTokenException(String errorCode, String message, Throwable cause) { + super(message, cause); + this.errorCode = errorCode; + } + + public String getErrorCode() { + return errorCode; + } +} diff --git a/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/domain/LoginRequest.java b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/domain/LoginRequest.java new file mode 100644 index 00000000..cdc4c74b --- /dev/null +++ b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/domain/LoginRequest.java @@ -0,0 +1,24 @@ +package com.datai.salesforceauth.model.domain; + +public class LoginRequest { + + private String systemName; + + private String loginType; + + public String getSystemName() { + return systemName; + } + + public void setSystemName(String systemName) { + this.systemName = systemName; + } + + public String getLoginType() { + return loginType; + } + + public void setLoginType(String loginType) { + this.loginType = loginType; + } +} diff --git a/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/domain/LoginResult.java b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/domain/LoginResult.java new file mode 100644 index 00000000..bf09b742 --- /dev/null +++ b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/domain/LoginResult.java @@ -0,0 +1,70 @@ +package com.datai.salesforceauth.model.domain; + +public class LoginResult { + + private String sessionId; + + private String serverUrl; + + private UserInfo userInfo; + + public static LoginResultBuilder builder() { + return new LoginResultBuilder(); + } + + public String getSessionId() { + return sessionId; + } + + public void setSessionId(String sessionId) { + this.sessionId = sessionId; + } + + public String getServerUrl() { + return serverUrl; + } + + public void setServerUrl(String serverUrl) { + this.serverUrl = serverUrl; + } + + public UserInfo getUserInfo() { + return userInfo; + } + + public void setUserInfo(UserInfo userInfo) { + this.userInfo = userInfo; + } + + public static class LoginResultBuilder { + + private String sessionId; + + private String serverUrl; + + private UserInfo userInfo; + + public LoginResultBuilder sessionId(String sessionId) { + this.sessionId = sessionId; + return this; + } + + public LoginResultBuilder serverUrl(String serverUrl) { + this.serverUrl = serverUrl; + return this; + } + + public LoginResultBuilder userInfo(UserInfo userInfo) { + this.userInfo = userInfo; + return this; + } + + public LoginResult build() { + LoginResult result = new LoginResult(); + result.setSessionId(sessionId); + result.setServerUrl(serverUrl); + result.setUserInfo(userInfo); + return result; + } + } +} diff --git a/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/domain/UserInfo.java b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/domain/UserInfo.java new file mode 100644 index 00000000..ec1edadc --- /dev/null +++ b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/domain/UserInfo.java @@ -0,0 +1,44 @@ +package com.datai.salesforceauth.model.domain; + +public class UserInfo { + + private String userId; + + private String username; + + private String orgId; + + private String orgName; + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getOrgId() { + return orgId; + } + + public void setOrgId(String orgId) { + this.orgId = orgId; + } + + public String getOrgName() { + return orgName; + } + + public void setOrgName(String orgName) { + this.orgName = orgName; + } +} diff --git a/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/dto/LogoutRequest.java b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/dto/LogoutRequest.java new file mode 100644 index 00000000..2fe7fdc5 --- /dev/null +++ b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/dto/LogoutRequest.java @@ -0,0 +1,24 @@ +package com.datai.salesforceauth.model.dto; + +public class LogoutRequest { + + private String systemName; + + private String loginType; + + public String getSystemName() { + return systemName; + } + + public void setSystemName(String systemName) { + this.systemName = systemName; + } + + public String getLoginType() { + return loginType; + } + + public void setLoginType(String loginType) { + this.loginType = loginType; + } +} diff --git a/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/dto/OAuth2AuthorizationCodeLoginRequest.java b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/dto/OAuth2AuthorizationCodeLoginRequest.java new file mode 100644 index 00000000..ed21a0b1 --- /dev/null +++ b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/dto/OAuth2AuthorizationCodeLoginRequest.java @@ -0,0 +1,41 @@ +package com.datai.salesforceauth.model.dto; + +import com.datai.salesforceauth.model.domain.LoginRequest; + +public class OAuth2AuthorizationCodeLoginRequest extends LoginRequest { + + private String grantType; + + private String code; + + private String redirectUri; + + public OAuth2AuthorizationCodeLoginRequest() { + super(); + setGrantType("authorization_code"); + } + + public String getGrantType() { + return grantType; + } + + public void setGrantType(String grantType) { + this.grantType = grantType; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getRedirectUri() { + return redirectUri; + } + + public void setRedirectUri(String redirectUri) { + this.redirectUri = redirectUri; + } +} diff --git a/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/dto/OAuth2ClientCredentialsLoginRequest.java b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/dto/OAuth2ClientCredentialsLoginRequest.java new file mode 100644 index 00000000..50fbd449 --- /dev/null +++ b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/dto/OAuth2ClientCredentialsLoginRequest.java @@ -0,0 +1,21 @@ +package com.datai.salesforceauth.model.dto; + +import com.datai.salesforceauth.model.domain.LoginRequest; + +public class OAuth2ClientCredentialsLoginRequest extends LoginRequest { + + private String grantType; + + public OAuth2ClientCredentialsLoginRequest() { + super(); + setGrantType("client_credentials"); + } + + public String getGrantType() { + return grantType; + } + + public void setGrantType(String grantType) { + this.grantType = grantType; + } +} diff --git a/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/dto/OAuth2PasswordLoginRequest.java b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/dto/OAuth2PasswordLoginRequest.java new file mode 100644 index 00000000..68e7f4c5 --- /dev/null +++ b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/dto/OAuth2PasswordLoginRequest.java @@ -0,0 +1,21 @@ +package com.datai.salesforceauth.model.dto; + +import com.datai.salesforceauth.model.domain.LoginRequest; + +public class OAuth2PasswordLoginRequest extends LoginRequest { + + private String grantType; + + public OAuth2PasswordLoginRequest() { + super(); + setGrantType("password"); + } + + public String getGrantType() { + return grantType; + } + + public void setGrantType(String grantType) { + this.grantType = grantType; + } +} diff --git a/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/dto/RefreshTokenRequest.java b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/dto/RefreshTokenRequest.java new file mode 100644 index 00000000..e12a9eef --- /dev/null +++ b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/dto/RefreshTokenRequest.java @@ -0,0 +1,24 @@ +package com.datai.salesforceauth.model.dto; + +public class RefreshTokenRequest { + + private String systemName; + + private String loginType; + + public String getSystemName() { + return systemName; + } + + public void setSystemName(String systemName) { + this.systemName = systemName; + } + + public String getLoginType() { + return loginType; + } + + public void setLoginType(String loginType) { + this.loginType = loginType; + } +} diff --git a/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/dto/SessionIdLoginRequest.java b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/dto/SessionIdLoginRequest.java new file mode 100644 index 00000000..c874032f --- /dev/null +++ b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/dto/SessionIdLoginRequest.java @@ -0,0 +1,26 @@ +package com.datai.salesforceauth.model.dto; + +import com.datai.salesforceauth.model.domain.LoginRequest; + +public class SessionIdLoginRequest extends LoginRequest { + + private String sessionId; + + private String serverUrl; + + public String getSessionId() { + return sessionId; + } + + public void setSessionId(String sessionId) { + this.sessionId = sessionId; + } + + public String getServerUrl() { + return serverUrl; + } + + public void setServerUrl(String serverUrl) { + this.serverUrl = serverUrl; + } +} diff --git a/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/vo/LoginResponse.java b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/vo/LoginResponse.java new file mode 100644 index 00000000..5fb15265 --- /dev/null +++ b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/vo/LoginResponse.java @@ -0,0 +1,34 @@ +package com.datai.salesforceauth.model.vo; + +public class LoginResponse { + + private String sessionId; + + private String serverUrl; + + private UserInfoVo userInfo; + + public String getSessionId() { + return sessionId; + } + + public void setSessionId(String sessionId) { + this.sessionId = sessionId; + } + + public String getServerUrl() { + return serverUrl; + } + + public void setServerUrl(String serverUrl) { + this.serverUrl = serverUrl; + } + + public UserInfoVo getUserInfo() { + return userInfo; + } + + public void setUserInfo(UserInfoVo userInfo) { + this.userInfo = userInfo; + } +} diff --git a/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/vo/LoginTypeVo.java b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/vo/LoginTypeVo.java new file mode 100644 index 00000000..52d34106 --- /dev/null +++ b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/vo/LoginTypeVo.java @@ -0,0 +1,34 @@ +package com.datai.salesforceauth.model.vo; + +public class LoginTypeVo { + + private String loginType; + + private String loginTypeName; + + private String description; + + public String getLoginType() { + return loginType; + } + + public void setLoginType(String loginType) { + this.loginType = loginType; + } + + public String getLoginTypeName() { + return loginTypeName; + } + + public void setLoginTypeName(String loginTypeName) { + this.loginTypeName = loginTypeName; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/vo/UserInfoVo.java b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/vo/UserInfoVo.java new file mode 100644 index 00000000..edbe843e --- /dev/null +++ b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/model/vo/UserInfoVo.java @@ -0,0 +1,44 @@ +package com.datai.salesforceauth.model.vo; + +public class UserInfoVo { + + private String userId; + + private String username; + + private String orgId; + + private String orgName; + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getOrgId() { + return orgId; + } + + public void setOrgId(String orgId) { + this.orgId = orgId; + } + + public String getOrgName() { + return orgName; + } + + public void setOrgName(String orgName) { + this.orgName = orgName; + } +} diff --git a/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/service/ISalesforceAuthService.java b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/service/ISalesforceAuthService.java new file mode 100644 index 00000000..69d219c9 --- /dev/null +++ b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/service/ISalesforceAuthService.java @@ -0,0 +1,20 @@ +package com.datai.salesforceauth.service; + +import com.datai.salesforceauth.model.dto.LoginRequest; +import com.datai.salesforceauth.model.dto.LogoutRequest; +import com.datai.salesforceauth.model.dto.RefreshTokenRequest; +import com.datai.salesforceauth.model.vo.LoginResponse; +import com.datai.salesforceauth.model.vo.LoginTypeVo; + +import java.util.List; + +public interface ISalesforceAuthService { + + LoginResponse login(LoginRequest request); + + LoginResponse refreshToken(RefreshTokenRequest request); + + void logout(LogoutRequest request); + + List getSupportedLoginTypes(); +} diff --git a/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/service/impl/SalesforceAuthServiceImpl.java b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/service/impl/SalesforceAuthServiceImpl.java new file mode 100644 index 00000000..6fc7cd6e --- /dev/null +++ b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/service/impl/SalesforceAuthServiceImpl.java @@ -0,0 +1,120 @@ +package com.datai.salesforceauth.service.impl; + +import com.datai.salesforceauth.exception.LoginException; +import com.datai.salesforceauth.exception.RefreshTokenException; +import com.datai.salesforceauth.model.domain.LoginRequest; +import com.datai.salesforceauth.model.domain.LoginResult; +import com.datai.salesforceauth.model.domain.UserInfo; +import com.datai.salesforceauth.model.dto.LogoutRequest; +import com.datai.salesforceauth.model.dto.RefreshTokenRequest; +import com.datai.salesforceauth.model.dto.OAuth2PasswordLoginRequest; +import com.datai.salesforceauth.model.dto.OAuth2ClientCredentialsLoginRequest; +import com.datai.salesforceauth.model.dto.OAuth2AuthorizationCodeLoginRequest; +import com.datai.salesforceauth.model.dto.SessionIdLoginRequest; +import com.datai.salesforceauth.model.vo.LoginResponse; +import com.datai.salesforceauth.model.vo.LoginTypeVo; +import com.datai.salesforceauth.model.vo.UserInfoVo; +import com.datai.salesforceauth.service.ISalesforceAuthService; +import com.datai.salesforceauth.strategy.LoginStrategy; +import com.datai.salesforceauth.strategy.LoginStrategyFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class SalesforceAuthServiceImpl implements ISalesforceAuthService { + + @Autowired + private LoginStrategyFactory loginStrategyFactory; + + @Override + public LoginResponse login(LoginRequest request) { + try { + LoginStrategy strategy = loginStrategyFactory.getStrategy(request.getLoginType()); + LoginResult result = strategy.login(request); + + LoginResponse response = new LoginResponse(); + response.setSessionId(result.getSessionId()); + response.setServerUrl(result.getServerUrl()); + + if (result.getUserInfo() != null) { + UserInfoVo userInfoVo = new UserInfoVo(); + userInfoVo.setUserId(result.getUserInfo().getUserId()); + userInfoVo.setUsername(result.getUserInfo().getUsername()); + userInfoVo.setOrgId(result.getUserInfo().getOrgId()); + userInfoVo.setOrgName(result.getUserInfo().getOrgName()); + response.setUserInfo(userInfoVo); + } + + return response; + } catch (LoginException e) { + throw new RuntimeException("登录失败: " + e.getMessage(), e); + } + } + + @Override + public LoginResponse refreshToken(RefreshTokenRequest request) { + try { + LoginStrategy strategy = loginStrategyFactory.getStrategy(request.getLoginType()); + LoginResult result = strategy.refreshToken(request); + + LoginResponse response = new LoginResponse(); + response.setSessionId(result.getSessionId()); + response.setServerUrl(result.getServerUrl()); + + return response; + } catch (RefreshTokenException e) { + throw new RuntimeException("刷新令牌失败: " + e.getMessage(), e); + } + } + + @Override + public void logout(LogoutRequest request) { + try { + LoginStrategy strategy = loginStrategyFactory.getStrategy(request.getLoginType()); + strategy.logout(request); + } catch (LoginException e) { + throw new RuntimeException("登出失败: " + e.getMessage(), e); + } + } + + @Override + public List getSupportedLoginTypes() { + List loginTypes = loginStrategyFactory.getSupportedLoginTypes(); + List result = new ArrayList<>(); + + for (String loginType : loginTypes) { + LoginTypeVo vo = new LoginTypeVo(); + vo.setLoginType(loginType); + + switch (loginType) { + case "oauth2_password": + vo.setLoginTypeName("OAuth2 Password 登录"); + vo.setDescription("使用用户名、密码、安全令牌进行登录"); + break; + case "oauth2_client_credentials": + vo.setLoginTypeName("OAuth2 Client Credentials 登录"); + vo.setDescription("使用客户端凭证进行登录"); + break; + case "oauth2_authorization_code": + vo.setLoginTypeName("OAuth2 Authorization Code 登录"); + vo.setDescription("使用授权码进行登录"); + break; + case "session_id": + vo.setLoginTypeName("Session ID 登录"); + vo.setDescription("使用已有的 Session ID 进行登录"); + break; + default: + vo.setLoginTypeName(loginType); + vo.setDescription(""); + break; + } + + result.add(vo); + } + + return result; + } +} diff --git a/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/strategy/LoginStrategy.java b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/strategy/LoginStrategy.java new file mode 100644 index 00000000..f7505acc --- /dev/null +++ b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/strategy/LoginStrategy.java @@ -0,0 +1,21 @@ +package com.datai.salesforceauth.strategy; + +import com.datai.salesforceauth.exception.LoginException; +import com.datai.salesforceauth.exception.RefreshTokenException; +import com.datai.salesforceauth.model.domain.LoginRequest; +import com.datai.salesforceauth.model.domain.LoginResult; +import com.datai.salesforceauth.model.dto.LogoutRequest; +import com.datai.salesforceauth.model.dto.RefreshTokenRequest; + +public interface LoginStrategy { + + LoginResult login(LoginRequest request) throws LoginException; + + LoginResult refreshToken(RefreshTokenRequest request) throws RefreshTokenException; + + void logout(LogoutRequest request) throws LoginException; + + String getLoginType(); + + boolean supportRefreshToken(); +} diff --git a/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/strategy/LoginStrategyFactory.java b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/strategy/LoginStrategyFactory.java new file mode 100644 index 00000000..70933b52 --- /dev/null +++ b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/strategy/LoginStrategyFactory.java @@ -0,0 +1,38 @@ +package com.datai.salesforceauth.strategy; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class LoginStrategyFactory { + + private final Map strategyMap; + + @Autowired + public LoginStrategyFactory(List strategies) { + this.strategyMap = strategies.stream() + .collect(Collectors.toMap(LoginStrategy::getLoginType, Function.identity())); + } + + public LoginStrategy getStrategy(String loginType) { + LoginStrategy strategy = strategyMap.get(loginType); + if (strategy == null) { + throw new IllegalArgumentException("不支持的登录类型: " + loginType); + } + return strategy; + } + + public List getSupportedLoginTypes() { + return new ArrayList<>(strategyMap.keySet()); + } + + public void registerStrategy(String loginType, LoginStrategy strategy) { + strategyMap.put(loginType, strategy); + } +} diff --git a/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/strategy/OAuth2AuthorizationCodeLoginStrategy.java b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/strategy/OAuth2AuthorizationCodeLoginStrategy.java new file mode 100644 index 00000000..6e363547 --- /dev/null +++ b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/strategy/OAuth2AuthorizationCodeLoginStrategy.java @@ -0,0 +1,180 @@ +package com.datai.salesforceauth.strategy; + +import com.datai.salesforceauth.exception.LoginException; +import com.datai.salesforceauth.exception.RefreshTokenException; +import com.datai.salesforceauth.model.domain.DataiSfSystemConfig; +import com.datai.salesforceauth.model.domain.LoginRequest; +import com.datai.salesforceauth.model.domain.LoginResult; +import com.datai.salesforceauth.model.domain.UserInfo; +import com.datai.salesforceauth.model.dto.LogoutRequest; +import com.datai.salesforceauth.model.dto.OAuth2AuthorizationCodeLoginRequest; +import com.datai.salesforceauth.model.dto.RefreshTokenRequest; +import com.datai.salesforceauth.service.IDataiSfSystemConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class OAuth2AuthorizationCodeLoginStrategy implements LoginStrategy { + + @Autowired + private IDataiSfSystemConfigService systemConfigService; + + @Override + public LoginResult login(LoginRequest request) throws LoginException { + OAuth2AuthorizationCodeLoginRequest authCodeRequest = (OAuth2AuthorizationCodeLoginRequest) request; + + DataiSfSystemConfig config = systemConfigService.getBySystemName(authCodeRequest.getSystemName()); + + String clientId = config.getClientId(); + String clientSecret = config.getClientSecret(); + String code = authCodeRequest.getCode(); + String redirectUri = authCodeRequest.getRedirectUri(); + + OAuth2TokenResponse tokenResponse = oauth2AuthorizationCodeLogin(clientId, clientSecret, code, redirectUri); + + UserInfo userInfo = getUserInfo(tokenResponse.getAccessToken()); + + DataiSfSystemConfig updateConfig = new DataiSfSystemConfig(); + updateConfig.setId(config.getId()); + updateConfig.setSessionId(tokenResponse.getAccessToken()); + updateConfig.setServerUrl(tokenResponse.getInstanceUrl()); + updateConfig.setAccessToken(tokenResponse.getAccessToken()); + updateConfig.setRefreshToken(tokenResponse.getRefreshToken()); + updateConfig.setTokenExpiresAt(tokenResponse.getExpiresAt()); + updateConfig.setSfUserId(userInfo.getUserId()); + updateConfig.setUserId(userInfo.getUsername()); + updateConfig.setOrgId(userInfo.getOrgId()); + updateConfig.setOrgName(userInfo.getOrgName()); + + systemConfigService.updateLoginInfo(updateConfig); + + return LoginResult.builder() + .sessionId(tokenResponse.getAccessToken()) + .serverUrl(tokenResponse.getInstanceUrl()) + .userInfo(userInfo) + .build(); + } + + @Override + public LoginResult refreshToken(RefreshTokenRequest request) throws RefreshTokenException { + DataiSfSystemConfig config = systemConfigService.getBySystemName(request.getSystemName()); + + String clientId = config.getClientId(); + String clientSecret = config.getClientSecret(); + String refreshToken = config.getRefreshToken(); + + OAuth2TokenResponse tokenResponse = refreshToken(clientId, clientSecret, refreshToken); + + DataiSfSystemConfig updateConfig = new DataiSfSystemConfig(); + updateConfig.setId(config.getId()); + updateConfig.setSessionId(tokenResponse.getAccessToken()); + updateConfig.setServerUrl(tokenResponse.getInstanceUrl()); + updateConfig.setAccessToken(tokenResponse.getAccessToken()); + updateConfig.setRefreshToken(tokenResponse.getRefreshToken()); + updateConfig.setTokenExpiresAt(tokenResponse.getExpiresAt()); + + systemConfigService.updateLoginInfo(updateConfig); + + return LoginResult.builder() + .sessionId(tokenResponse.getAccessToken()) + .serverUrl(tokenResponse.getInstanceUrl()) + .build(); + } + + @Override + public void logout(LogoutRequest request) throws LoginException { + DataiSfSystemConfig config = systemConfigService.getBySystemName(request.getSystemName()); + + logout(config.getSessionId()); + + DataiSfSystemConfig updateConfig = new DataiSfSystemConfig(); + updateConfig.setId(config.getId()); + updateConfig.setSessionId(null); + updateConfig.setServerUrl(null); + updateConfig.setAccessToken(null); + updateConfig.setRefreshToken(null); + updateConfig.setTokenExpiresAt(null); + + systemConfigService.updateLoginInfo(updateConfig); + } + + @Override + public String getLoginType() { + return "oauth2_authorization_code"; + } + + @Override + public boolean supportRefreshToken() { + return true; + } + + private OAuth2TokenResponse oauth2AuthorizationCodeLogin(String clientId, String clientSecret, String code, String redirectUri) { + OAuth2TokenResponse response = new OAuth2TokenResponse(); + response.setAccessToken("mock_access_token"); + response.setRefreshToken("mock_refresh_token"); + response.setInstanceUrl("https://mock-instance.salesforce.com"); + response.setExpiresAt(new java.util.Date(System.currentTimeMillis() + 3600000)); + return response; + } + + private OAuth2TokenResponse refreshToken(String clientId, String clientSecret, String refreshToken) { + OAuth2TokenResponse response = new OAuth2TokenResponse(); + response.setAccessToken("new_mock_access_token"); + response.setRefreshToken("new_mock_refresh_token"); + response.setInstanceUrl("https://mock-instance.salesforce.com"); + response.setExpiresAt(new java.util.Date(System.currentTimeMillis() + 3600000)); + return response; + } + + private UserInfo getUserInfo(String accessToken) { + UserInfo userInfo = new UserInfo(); + userInfo.setUserId("mock_user_id"); + userInfo.setUsername("mock_username"); + userInfo.setOrgId("mock_org_id"); + userInfo.setOrgName("mock_org_name"); + return userInfo; + } + + private void logout(String sessionId) { + + } + + private static class OAuth2TokenResponse { + private String accessToken; + private String refreshToken; + private String instanceUrl; + private java.util.Date expiresAt; + + public String getAccessToken() { + return accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + + public String getRefreshToken() { + return refreshToken; + } + + public void setRefreshToken(String refreshToken) { + this.refreshToken = refreshToken; + } + + public String getInstanceUrl() { + return instanceUrl; + } + + public void setInstanceUrl(String instanceUrl) { + this.instanceUrl = instanceUrl; + } + + public java.util.Date getExpiresAt() { + return expiresAt; + } + + public void setExpiresAt(java.util.Date expiresAt) { + this.expiresAt = expiresAt; + } + } +} diff --git a/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/strategy/OAuth2ClientCredentialsLoginStrategy.java b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/strategy/OAuth2ClientCredentialsLoginStrategy.java new file mode 100644 index 00000000..f04321de --- /dev/null +++ b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/strategy/OAuth2ClientCredentialsLoginStrategy.java @@ -0,0 +1,178 @@ +package com.datai.salesforceauth.strategy; + +import com.datai.salesforceauth.exception.LoginException; +import com.datai.salesforceauth.exception.RefreshTokenException; +import com.datai.salesforceauth.model.domain.DataiSfSystemConfig; +import com.datai.salesforceauth.model.domain.LoginRequest; +import com.datai.salesforceauth.model.domain.LoginResult; +import com.datai.salesforceauth.model.domain.UserInfo; +import com.datai.salesforceauth.model.dto.LogoutRequest; +import com.datai.salesforceauth.model.dto.OAuth2ClientCredentialsLoginRequest; +import com.datai.salesforceauth.model.dto.RefreshTokenRequest; +import com.datai.salesforceauth.service.IDataiSfSystemConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class OAuth2ClientCredentialsLoginStrategy implements LoginStrategy { + + @Autowired + private IDataiSfSystemConfigService systemConfigService; + + @Override + public LoginResult login(LoginRequest request) throws LoginException { + OAuth2ClientCredentialsLoginRequest clientCredentialsRequest = (OAuth2ClientCredentialsLoginRequest) request; + + DataiSfSystemConfig config = systemConfigService.getBySystemName(clientCredentialsRequest.getSystemName()); + + String clientId = config.getClientId(); + String clientSecret = config.getClientSecret(); + + OAuth2TokenResponse tokenResponse = oauth2ClientCredentialsLogin(clientId, clientSecret); + + UserInfo userInfo = getUserInfo(tokenResponse.getAccessToken()); + + DataiSfSystemConfig updateConfig = new DataiSfSystemConfig(); + updateConfig.setId(config.getId()); + updateConfig.setSessionId(tokenResponse.getAccessToken()); + updateConfig.setServerUrl(tokenResponse.getInstanceUrl()); + updateConfig.setAccessToken(tokenResponse.getAccessToken()); + updateConfig.setRefreshToken(tokenResponse.getRefreshToken()); + updateConfig.setTokenExpiresAt(tokenResponse.getExpiresAt()); + updateConfig.setSfUserId(userInfo.getUserId()); + updateConfig.setUserId(userInfo.getUsername()); + updateConfig.setOrgId(userInfo.getOrgId()); + updateConfig.setOrgName(userInfo.getOrgName()); + + systemConfigService.updateLoginInfo(updateConfig); + + return LoginResult.builder() + .sessionId(tokenResponse.getAccessToken()) + .serverUrl(tokenResponse.getInstanceUrl()) + .userInfo(userInfo) + .build(); + } + + @Override + public LoginResult refreshToken(RefreshTokenRequest request) throws RefreshTokenException { + DataiSfSystemConfig config = systemConfigService.getBySystemName(request.getSystemName()); + + String clientId = config.getClientId(); + String clientSecret = config.getClientSecret(); + String refreshToken = config.getRefreshToken(); + + OAuth2TokenResponse tokenResponse = refreshToken(clientId, clientSecret, refreshToken); + + DataiSfSystemConfig updateConfig = new DataiSfSystemConfig(); + updateConfig.setId(config.getId()); + updateConfig.setSessionId(tokenResponse.getAccessToken()); + updateConfig.setServerUrl(tokenResponse.getInstanceUrl()); + updateConfig.setAccessToken(tokenResponse.getAccessToken()); + updateConfig.setRefreshToken(tokenResponse.getRefreshToken()); + updateConfig.setTokenExpiresAt(tokenResponse.getExpiresAt()); + + systemConfigService.updateLoginInfo(updateConfig); + + return LoginResult.builder() + .sessionId(tokenResponse.getAccessToken()) + .serverUrl(tokenResponse.getInstanceUrl()) + .build(); + } + + @Override + public void logout(LogoutRequest request) throws LoginException { + DataiSfSystemConfig config = systemConfigService.getBySystemName(request.getSystemName()); + + logout(config.getSessionId()); + + DataiSfSystemConfig updateConfig = new DataiSfSystemConfig(); + updateConfig.setId(config.getId()); + updateConfig.setSessionId(null); + updateConfig.setServerUrl(null); + updateConfig.setAccessToken(null); + updateConfig.setRefreshToken(null); + updateConfig.setTokenExpiresAt(null); + + systemConfigService.updateLoginInfo(updateConfig); + } + + @Override + public String getLoginType() { + return "oauth2_client_credentials"; + } + + @Override + public boolean supportRefreshToken() { + return true; + } + + private OAuth2TokenResponse oauth2ClientCredentialsLogin(String clientId, String clientSecret) { + OAuth2TokenResponse response = new OAuth2TokenResponse(); + response.setAccessToken("mock_access_token"); + response.setRefreshToken("mock_refresh_token"); + response.setInstanceUrl("https://mock-instance.salesforce.com"); + response.setExpiresAt(new java.util.Date(System.currentTimeMillis() + 3600000)); + return response; + } + + private OAuth2TokenResponse refreshToken(String clientId, String clientSecret, String refreshToken) { + OAuth2TokenResponse response = new OAuth2TokenResponse(); + response.setAccessToken("new_mock_access_token"); + response.setRefreshToken("new_mock_refresh_token"); + response.setInstanceUrl("https://mock-instance.salesforce.com"); + response.setExpiresAt(new java.util.Date(System.currentTimeMillis() + 3600000)); + return response; + } + + private UserInfo getUserInfo(String accessToken) { + UserInfo userInfo = new UserInfo(); + userInfo.setUserId("mock_user_id"); + userInfo.setUsername("mock_username"); + userInfo.setOrgId("mock_org_id"); + userInfo.setOrgName("mock_org_name"); + return userInfo; + } + + private void logout(String sessionId) { + + } + + private static class OAuth2TokenResponse { + private String accessToken; + private String refreshToken; + private String instanceUrl; + private java.util.Date expiresAt; + + public String getAccessToken() { + return accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + + public String getRefreshToken() { + return refreshToken; + } + + public void setRefreshToken(String refreshToken) { + this.refreshToken = refreshToken; + } + + public String getInstanceUrl() { + return instanceUrl; + } + + public void setInstanceUrl(String instanceUrl) { + this.instanceUrl = instanceUrl; + } + + public java.util.Date getExpiresAt() { + return expiresAt; + } + + public void setExpiresAt(java.util.Date expiresAt) { + this.expiresAt = expiresAt; + } + } +} diff --git a/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/strategy/OAuth2PasswordLoginStrategy.java b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/strategy/OAuth2PasswordLoginStrategy.java new file mode 100644 index 00000000..74d5c7d3 --- /dev/null +++ b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/strategy/OAuth2PasswordLoginStrategy.java @@ -0,0 +1,181 @@ +package com.datai.salesforceauth.strategy; + +import com.datai.salesforceauth.exception.LoginException; +import com.datai.salesforceauth.exception.RefreshTokenException; +import com.datai.salesforceauth.model.domain.DataiSfSystemConfig; +import com.datai.salesforceauth.model.domain.LoginRequest; +import com.datai.salesforceauth.model.domain.LoginResult; +import com.datai.salesforceauth.model.domain.UserInfo; +import com.datai.salesforceauth.model.dto.LogoutRequest; +import com.datai.salesforceauth.model.dto.OAuth2PasswordLoginRequest; +import com.datai.salesforceauth.model.dto.RefreshTokenRequest; +import com.datai.salesforceauth.service.IDataiSfSystemConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class OAuth2PasswordLoginStrategy implements LoginStrategy { + + @Autowired + private IDataiSfSystemConfigService systemConfigService; + + @Override + public LoginResult login(LoginRequest request) throws LoginException { + OAuth2PasswordLoginRequest passwordRequest = (OAuth2PasswordLoginRequest) request; + + DataiSfSystemConfig config = systemConfigService.getBySystemName(passwordRequest.getSystemName()); + + String clientId = config.getClientId(); + String clientSecret = config.getClientSecret(); + String username = config.getUsername(); + String password = config.getPassword(); + String securityToken = config.getSecurityToken(); + + OAuth2TokenResponse tokenResponse = oauth2PasswordLogin(clientId, clientSecret, username, password, securityToken); + + UserInfo userInfo = getUserInfo(tokenResponse.getAccessToken()); + + DataiSfSystemConfig updateConfig = new DataiSfSystemConfig(); + updateConfig.setId(config.getId()); + updateConfig.setSessionId(tokenResponse.getAccessToken()); + updateConfig.setServerUrl(tokenResponse.getInstanceUrl()); + updateConfig.setAccessToken(tokenResponse.getAccessToken()); + updateConfig.setRefreshToken(tokenResponse.getRefreshToken()); + updateConfig.setTokenExpiresAt(tokenResponse.getExpiresAt()); + updateConfig.setSfUserId(userInfo.getUserId()); + updateConfig.setUserId(userInfo.getUsername()); + updateConfig.setOrgId(userInfo.getOrgId()); + updateConfig.setOrgName(userInfo.getOrgName()); + + systemConfigService.updateLoginInfo(updateConfig); + + return LoginResult.builder() + .sessionId(tokenResponse.getAccessToken()) + .serverUrl(tokenResponse.getInstanceUrl()) + .userInfo(userInfo) + .build(); + } + + @Override + public LoginResult refreshToken(RefreshTokenRequest request) throws RefreshTokenException { + DataiSfSystemConfig config = systemConfigService.getBySystemName(request.getSystemName()); + + String clientId = config.getClientId(); + String clientSecret = config.getClientSecret(); + String refreshToken = config.getRefreshToken(); + + OAuth2TokenResponse tokenResponse = refreshToken(clientId, clientSecret, refreshToken); + + DataiSfSystemConfig updateConfig = new DataiSfSystemConfig(); + updateConfig.setId(config.getId()); + updateConfig.setSessionId(tokenResponse.getAccessToken()); + updateConfig.setServerUrl(tokenResponse.getInstanceUrl()); + updateConfig.setAccessToken(tokenResponse.getAccessToken()); + updateConfig.setRefreshToken(tokenResponse.getRefreshToken()); + updateConfig.setTokenExpiresAt(tokenResponse.getExpiresAt()); + + systemConfigService.updateLoginInfo(updateConfig); + + return LoginResult.builder() + .sessionId(tokenResponse.getAccessToken()) + .serverUrl(tokenResponse.getInstanceUrl()) + .build(); + } + + @Override + public void logout(LogoutRequest request) throws LoginException { + DataiSfSystemConfig config = systemConfigService.getBySystemName(request.getSystemName()); + + logout(config.getSessionId()); + + DataiSfSystemConfig updateConfig = new DataiSfSystemConfig(); + updateConfig.setId(config.getId()); + updateConfig.setSessionId(null); + updateConfig.setServerUrl(null); + updateConfig.setAccessToken(null); + updateConfig.setRefreshToken(null); + updateConfig.setTokenExpiresAt(null); + + systemConfigService.updateLoginInfo(updateConfig); + } + + @Override + public String getLoginType() { + return "oauth2_password"; + } + + @Override + public boolean supportRefreshToken() { + return true; + } + + private OAuth2TokenResponse oauth2PasswordLogin(String clientId, String clientSecret, String username, String password, String securityToken) { + OAuth2TokenResponse response = new OAuth2TokenResponse(); + response.setAccessToken("mock_access_token"); + response.setRefreshToken("mock_refresh_token"); + response.setInstanceUrl("https://mock-instance.salesforce.com"); + response.setExpiresAt(new java.util.Date(System.currentTimeMillis() + 3600000)); + return response; + } + + private OAuth2TokenResponse refreshToken(String clientId, String clientSecret, String refreshToken) { + OAuth2TokenResponse response = new OAuth2TokenResponse(); + response.setAccessToken("new_mock_access_token"); + response.setRefreshToken("new_mock_refresh_token"); + response.setInstanceUrl("https://mock-instance.salesforce.com"); + response.setExpiresAt(new java.util.Date(System.currentTimeMillis() + 3600000)); + return response; + } + + private UserInfo getUserInfo(String accessToken) { + UserInfo userInfo = new UserInfo(); + userInfo.setUserId("mock_user_id"); + userInfo.setUsername("mock_username"); + userInfo.setOrgId("mock_org_id"); + userInfo.setOrgName("mock_org_name"); + return userInfo; + } + + private void logout(String sessionId) { + + } + + private static class OAuth2TokenResponse { + private String accessToken; + private String refreshToken; + private String instanceUrl; + private java.util.Date expiresAt; + + public String getAccessToken() { + return accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + + public String getRefreshToken() { + return refreshToken; + } + + public void setRefreshToken(String refreshToken) { + this.refreshToken = refreshToken; + } + + public String getInstanceUrl() { + return instanceUrl; + } + + public void setInstanceUrl(String instanceUrl) { + this.instanceUrl = instanceUrl; + } + + public java.util.Date getExpiresAt() { + return expiresAt; + } + + public void setExpiresAt(java.util.Date expiresAt) { + this.expiresAt = expiresAt; + } + } +} diff --git a/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/strategy/SessionIdLoginStrategy.java b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/strategy/SessionIdLoginStrategy.java new file mode 100644 index 00000000..543691cb --- /dev/null +++ b/datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/strategy/SessionIdLoginStrategy.java @@ -0,0 +1,69 @@ +package com.datai.salesforceauth.strategy; + +import com.datai.salesforceauth.exception.LoginException; +import com.datai.salesforceauth.exception.RefreshTokenException; +import com.datai.salesforceauth.model.domain.LoginRequest; +import com.datai.salesforceauth.model.domain.LoginResult; +import com.datai.salesforceauth.model.domain.UserInfo; +import com.datai.salesforceauth.model.dto.LogoutRequest; +import com.datai.salesforceauth.model.dto.RefreshTokenRequest; +import com.datai.salesforceauth.model.dto.SessionIdLoginRequest; +import org.springframework.stereotype.Component; + +@Component +public class SessionIdLoginStrategy implements LoginStrategy { + + @Override + public LoginResult login(LoginRequest request) throws LoginException { + SessionIdLoginRequest sessionIdRequest = (SessionIdLoginRequest) request; + + String sessionId = sessionIdRequest.getSessionId(); + String serverUrl = sessionIdRequest.getServerUrl(); + + UserInfo userInfo = getUserInfo(sessionId, serverUrl); + + return LoginResult.builder() + .sessionId(sessionId) + .serverUrl(serverUrl) + .userInfo(userInfo) + .build(); + } + + @Override + public LoginResult refreshToken(RefreshTokenRequest request) throws RefreshTokenException { + throw new RefreshTokenException("Session ID 登录不支持刷新令牌"); + } + + @Override + public void logout(LogoutRequest request) throws LoginException { + SessionIdLoginRequest sessionIdRequest = (SessionIdLoginRequest) request; + + String sessionId = sessionIdRequest.getSessionId(); + String serverUrl = sessionIdRequest.getServerUrl(); + + logout(sessionId, serverUrl); + } + + @Override + public String getLoginType() { + return "session_id"; + } + + @Override + public boolean supportRefreshToken() { + return false; + } + + private UserInfo getUserInfo(String sessionId, String serverUrl) { + UserInfo userInfo = new UserInfo(); + userInfo.setUserId("mock_user_id"); + userInfo.setUsername("mock_username"); + userInfo.setOrgId("mock_org_id"); + userInfo.setOrgName("mock_org_name"); + return userInfo; + } + + private void logout(String sessionId, String serverUrl) { + + } +}