feat: 实现 Salesforce 策略模式登录功能

- 新增四种登录策略(OAuth2 Password、OAuth2 Client Credentials、OAuth2 Authorization Code、Session ID)
- 使用策略模式和工厂方法模式实现登录逻辑的灵活扩展
- 登录成功后回写到 datai_sf_system_config 表(OAuth2 登录)
- 支持刷新令牌功能(OAuth2 登录)
- 支持登出功能
- 提供登录类型查询接口
- 新增异常类(LoginException、RefreshTokenException)
- 新增模型类(Domain、DTO、VO)
- 新增策略类(LoginStrategy 接口及实现类、LoginStrategyFactory)
- 新增服务类(ISalesforceAuthService、SalesforceAuthServiceImpl)
- 新增控制器类(SalesforceAuthController)
This commit is contained in:
Kris 2026-01-22 01:03:12 +08:00
parent 8611d6b47f
commit 0f8873abae
23 changed files with 1322 additions and 0 deletions

View File

@ -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<LoginTypeVo> loginTypes = salesforceAuthService.getSupportedLoginTypes();
return AjaxResult.success(loginTypes);
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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<LoginTypeVo> getSupportedLoginTypes();
}

View File

@ -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<LoginTypeVo> getSupportedLoginTypes() {
List<String> loginTypes = loginStrategyFactory.getSupportedLoginTypes();
List<LoginTypeVo> 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;
}
}

View File

@ -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();
}

View File

@ -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<String, LoginStrategy> strategyMap;
@Autowired
public LoginStrategyFactory(List<LoginStrategy> 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<String> getSupportedLoginTypes() {
return new ArrayList<>(strategyMap.keySet());
}
public void registerStrategy(String loginType, LoginStrategy strategy) {
strategyMap.put(loginType, strategy);
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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) {
}
}