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:
parent
8611d6b47f
commit
0f8873abae
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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();
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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();
|
||||||
|
}
|
||||||
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user