【feat】 优化认证中心
This commit is contained in:
parent
725948e751
commit
654b342e46
@ -47,6 +47,7 @@ OAuth 2.0 登录支持三种授权类型(grant_type),每种类型需要不
|
|||||||
|
|
||||||
**可选参数**:
|
**可选参数**:
|
||||||
- `securityToken`: Salesforce 安全令牌(如果需要)
|
- `securityToken`: Salesforce 安全令牌(如果需要)
|
||||||
|
- `loginUrl`: 登录系统链接地址(如:`https://login.salesforce.com` 或 `https://test.salesforce.com`)
|
||||||
|
|
||||||
**请求示例**:
|
**请求示例**:
|
||||||
```json
|
```json
|
||||||
@ -55,7 +56,8 @@ OAuth 2.0 登录支持三种授权类型(grant_type),每种类型需要不
|
|||||||
"grantType": "password",
|
"grantType": "password",
|
||||||
"username": "user@example.com",
|
"username": "user@example.com",
|
||||||
"password": "your_password",
|
"password": "your_password",
|
||||||
"securityToken": "your_security_token"
|
"securityToken": "your_security_token",
|
||||||
|
"loginUrl": "https://test.salesforce.com"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -88,13 +90,17 @@ OAuth 2.0 登录支持三种授权类型(grant_type),每种类型需要不
|
|||||||
- `clientId`: OAuth 客户端 ID
|
- `clientId`: OAuth 客户端 ID
|
||||||
- `clientSecret`: OAuth 客户端密钥
|
- `clientSecret`: OAuth 客户端密钥
|
||||||
|
|
||||||
|
**可选参数**:
|
||||||
|
- `loginUrl`: 登录系统链接地址(如:`https://login.salesforce.com` 或 `https://test.salesforce.com`)
|
||||||
|
|
||||||
**请求示例**:
|
**请求示例**:
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"loginType": "oauth2",
|
"loginType": "oauth2",
|
||||||
"grantType": "client_credentials",
|
"grantType": "client_credentials",
|
||||||
"clientId": "your_client_id",
|
"clientId": "your_client_id",
|
||||||
"clientSecret": "your_client_secret"
|
"clientSecret": "your_client_secret",
|
||||||
|
"loginUrl": "https://test.salesforce.com"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -112,6 +118,9 @@ OAuth 2.0 登录支持三种授权类型(grant_type),每种类型需要不
|
|||||||
- `code`: OAuth 授权码
|
- `code`: OAuth 授权码
|
||||||
- `state`: OAuth state 参数(用于防止 CSRF 攻击)
|
- `state`: OAuth state 参数(用于防止 CSRF 攻击)
|
||||||
|
|
||||||
|
**可选参数**:
|
||||||
|
- `loginUrl`: 登录系统链接地址(如:`https://login.salesforce.com` 或 `https://test.salesforce.com`)
|
||||||
|
|
||||||
**请求示例**:
|
**请求示例**:
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
@ -120,7 +129,8 @@ OAuth 2.0 登录支持三种授权类型(grant_type),每种类型需要不
|
|||||||
"clientId": "your_client_id",
|
"clientId": "your_client_id",
|
||||||
"clientSecret": "your_client_secret",
|
"clientSecret": "your_client_secret",
|
||||||
"code": "authorization_code_from_salesforce",
|
"code": "authorization_code_from_salesforce",
|
||||||
"state": "random_state_string"
|
"state": "random_state_string",
|
||||||
|
"loginUrl": "https://test.salesforce.com"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -137,6 +147,7 @@ OAuth 2.0 登录支持三种授权类型(grant_type),每种类型需要不
|
|||||||
|
|
||||||
**可选参数**:
|
**可选参数**:
|
||||||
- `securityToken`: Salesforce 安全令牌(如果需要)
|
- `securityToken`: Salesforce 安全令牌(如果需要)
|
||||||
|
- `loginUrl`: 登录系统链接地址(如:`https://login.salesforce.com` 或 `https://test.salesforce.com`)
|
||||||
|
|
||||||
**请求示例**:
|
**请求示例**:
|
||||||
```json
|
```json
|
||||||
@ -144,7 +155,8 @@ OAuth 2.0 登录支持三种授权类型(grant_type),每种类型需要不
|
|||||||
"loginType": "legacy_credential",
|
"loginType": "legacy_credential",
|
||||||
"username": "user@example.com",
|
"username": "user@example.com",
|
||||||
"password": "your_password",
|
"password": "your_password",
|
||||||
"securityToken": "your_security_token"
|
"securityToken": "your_security_token",
|
||||||
|
"loginUrl": "https://test.salesforce.com"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -185,11 +197,15 @@ OAuth 2.0 登录支持三种授权类型(grant_type),每种类型需要不
|
|||||||
- `loginType`: `"session_id"`
|
- `loginType`: `"session_id"`
|
||||||
- `sessionId`: Salesforce Session ID
|
- `sessionId`: Salesforce Session ID
|
||||||
|
|
||||||
|
**可选参数**:
|
||||||
|
- `loginUrl`: 登录系统链接地址(如:`https://login.salesforce.com` 或 `https://test.salesforce.com`)
|
||||||
|
|
||||||
**请求示例**:
|
**请求示例**:
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"loginType": "session_id",
|
"loginType": "session_id",
|
||||||
"sessionId": "00Dxx0000000001!AQoAQH..."
|
"sessionId": "00Dxx0000000001!AQoAQH...",
|
||||||
|
"loginUrl": "https://test.salesforce.com"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -348,6 +364,7 @@ curl -X POST http://localhost:8080/salesforce/login/autoLogin
|
|||||||
| state | String | 条件必填 | OAuth state 参数(`oauth2` + `authorization_code` 登录时必填) |
|
| state | String | 条件必填 | OAuth state 参数(`oauth2` + `authorization_code` 登录时必填) |
|
||||||
| orgAlias | String | 条件必填 | Salesforce CLI 组织别名(`salesforce_cli` 登录时必填) |
|
| orgAlias | String | 条件必填 | Salesforce CLI 组织别名(`salesforce_cli` 登录时必填) |
|
||||||
| sessionId | String | 条件必填 | Salesforce Session ID(`session_id` 登录时必填) |
|
| sessionId | String | 条件必填 | Salesforce Session ID(`session_id` 登录时必填) |
|
||||||
|
| loginUrl | String | 可选 | 登录系统链接地址,用于指定 Salesforce 登录的 API 端点地址(如:`https://login.salesforce.com` 或 `https://test.salesforce.com`) |
|
||||||
| privateKeyPath | String | 可选 | 私有密钥路径(预留字段) |
|
| privateKeyPath | String | 可选 | 私有密钥路径(预留字段) |
|
||||||
| privateKeyPassword | String | 可选 | 私有密钥密码(预留字段) |
|
| privateKeyPassword | String | 可选 | 私有密钥密码(预留字段) |
|
||||||
|
|
||||||
@ -379,6 +396,7 @@ curl -X POST http://localhost:8080/salesforce/login/autoLogin
|
|||||||
| LOGIN_TYPE_EMPTY | 登录类型不能为空 |
|
| LOGIN_TYPE_EMPTY | 登录类型不能为空 |
|
||||||
| MISSING_USERNAME | 用户名不能为空 |
|
| MISSING_USERNAME | 用户名不能为空 |
|
||||||
| MISSING_PASSWORD | 密码不能为空 |
|
| MISSING_PASSWORD | 密码不能为空 |
|
||||||
|
| INVALID_LOGIN_URL | 登录地址格式错误 |
|
||||||
| OAUTH2_UNSUPPORTED_GRANT_TYPE | 不支持的授权类型 |
|
| OAUTH2_UNSUPPORTED_GRANT_TYPE | 不支持的授权类型 |
|
||||||
| OAUTH2_CONFIG_ERROR | OAuth 配置错误 |
|
| OAUTH2_CONFIG_ERROR | OAuth 配置错误 |
|
||||||
| OAUTH2_MISSING_CLIENT_ID | OAuth 客户端 ID 未配置 |
|
| OAUTH2_MISSING_CLIENT_ID | OAuth 客户端 ID 未配置 |
|
||||||
@ -399,6 +417,12 @@ curl -X POST http://localhost:8080/salesforce/login/autoLogin
|
|||||||
5. **会话管理**: 登出时会清理缓存和更新会话状态
|
5. **会话管理**: 登出时会清理缓存和更新会话状态
|
||||||
6. **安全令牌**: 在生产环境中,建议使用安全令牌增强安全性
|
6. **安全令牌**: 在生产环境中,建议使用安全令牌增强安全性
|
||||||
7. **环境配置**: 确保 Salesforce 环境配置正确(生产环境、沙盒环境或自定义环境)
|
7. **环境配置**: 确保 Salesforce 环境配置正确(生产环境、沙盒环境或自定义环境)
|
||||||
|
8. **自定义登录地址**: `loginUrl` 参数为可选参数,用于指定 Salesforce 登录的 API 端点地址
|
||||||
|
- 支持的登录地址示例:`https://login.salesforce.com`(生产环境)、`https://test.salesforce.com`(沙盒环境)
|
||||||
|
- 如果不提供 `loginUrl`,系统将使用默认配置的登录地址
|
||||||
|
- `loginUrl` 参数支持 `oauth2`、`legacy_credential` 和 `session_id` 登录类型
|
||||||
|
- `salesforce_cli` 登录类型不支持 `loginUrl` 参数,因为 CLI 工具内部管理登录状态
|
||||||
|
- 系统会自动验证 `loginUrl` 的格式,如果格式错误将返回错误信息
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -468,6 +492,7 @@ curl -X POST http://localhost:8080/salesforce/login/autoLogin
|
|||||||
|------|------|------|
|
|------|------|------|
|
||||||
| 1.0 | 2025-12-14 | 初始版本 |
|
| 1.0 | 2025-12-14 | 初始版本 |
|
||||||
| 1.1 | 2025-12-25 | 优化 logout、getCurrentLoginInfo、autoLogin 方法,无需传参 |
|
| 1.1 | 2025-12-25 | 优化 logout、getCurrentLoginInfo、autoLogin 方法,无需传参 |
|
||||||
|
| 1.2 | 2025-12-26 | 新增 loginUrl 参数,支持自定义 Salesforce 登录地址 |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@ -28,6 +28,33 @@
|
|||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
|
|
||||||
|
<el-form-item v-if="showLoginUrl" label="登录地址 (Login URL)" prop="loginUrl">
|
||||||
|
<el-input
|
||||||
|
v-model="loginForm.loginUrl"
|
||||||
|
prefix-icon="Link"
|
||||||
|
placeholder="https://login.salesforce.com"
|
||||||
|
clearable
|
||||||
|
:readonly="!isCustomLoginUrl"
|
||||||
|
>
|
||||||
|
<template #append>
|
||||||
|
<el-dropdown @command="handleLoginUrlPreset">
|
||||||
|
<el-button>
|
||||||
|
<el-icon><ArrowDown /></el-icon>
|
||||||
|
</el-button>
|
||||||
|
<template #dropdown>
|
||||||
|
<el-dropdown-menu>
|
||||||
|
<el-dropdown-item command="https://login.salesforce.com">生产环境</el-dropdown-item>
|
||||||
|
<el-dropdown-item command="https://test.salesforce.com">沙盒环境</el-dropdown-item>
|
||||||
|
<el-dropdown-item command="custom" divided>自定义</el-dropdown-item>
|
||||||
|
</el-dropdown-menu>
|
||||||
|
</template>
|
||||||
|
</el-dropdown>
|
||||||
|
</template>
|
||||||
|
</el-input>
|
||||||
|
<div class="form-tip">留空则使用系统默认配置</div>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
<el-form-item v-if="showUsername" label="用户名" prop="username">
|
<el-form-item v-if="showUsername" label="用户名" prop="username">
|
||||||
<el-input v-model="loginForm.username" prefix-icon="User" placeholder="name@company.com" clearable />
|
<el-input v-model="loginForm.username" prefix-icon="User" placeholder="name@company.com" clearable />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@ -64,6 +91,7 @@
|
|||||||
<el-input v-model="loginForm.sessionId" type="textarea" :rows="3" placeholder="Paste Session ID here" clearable />
|
<el-input v-model="loginForm.sessionId" type="textarea" :rows="3" placeholder="Paste Session ID here" clearable />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
|
|
||||||
<el-button type="primary" :loading="loginLoading" @click="handleLogin" class="main-login-btn">
|
<el-button type="primary" :loading="loginLoading" @click="handleLogin" class="main-login-btn">
|
||||||
<el-icon class="el-icon--left"><Switch /></el-icon>
|
<el-icon class="el-icon--left"><Switch /></el-icon>
|
||||||
发起登录请求
|
发起登录请求
|
||||||
@ -79,14 +107,14 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
|
|
||||||
<el-tooltip content="刷新查看当前Token状态" placement="bottom">
|
<el-tooltip content="刷新查看当前登录信息" placement="bottom">
|
||||||
<el-button type="info" plain :loading="currentLoading" @click="handleGetCurrentInfo" class="flex-btn">
|
<el-button type="info" plain :loading="currentLoading" @click="handleGetCurrentInfo" class="flex-btn">
|
||||||
<el-icon class="el-icon--left"><User /></el-icon>
|
<el-icon class="el-icon--left"><User /></el-icon>
|
||||||
刷新信息
|
刷新信息
|
||||||
</el-button>
|
</el-button>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
|
|
||||||
<el-tooltip content="销毁当前Session" placement="bottom">
|
<el-tooltip content="销毁当前登录信息" placement="bottom">
|
||||||
<el-button type="warning" plain :loading="logoutLoading" @click="handleLogout" class="flex-btn">
|
<el-button type="warning" plain :loading="logoutLoading" @click="handleLogout" class="flex-btn">
|
||||||
<el-icon class="el-icon--left"><SwitchButton /></el-icon>
|
<el-icon class="el-icon--left"><SwitchButton /></el-icon>
|
||||||
登出
|
登出
|
||||||
@ -194,7 +222,7 @@
|
|||||||
import { ElMessage, ElMessageBox } from 'element-plus';
|
import { ElMessage, ElMessageBox } from 'element-plus';
|
||||||
import {
|
import {
|
||||||
RefreshRight, User, SwitchButton, DocumentCopy, Switch,
|
RefreshRight, User, SwitchButton, DocumentCopy, Switch,
|
||||||
Connection, Key, Lock, Ticket, Hide, Monitor, TopRight
|
Connection, Key, Lock, Ticket, Hide, Monitor, TopRight, ArrowDown, Link
|
||||||
} from '@element-plus/icons-vue';
|
} from '@element-plus/icons-vue';
|
||||||
|
|
||||||
const { proxy } = getCurrentInstance();
|
const { proxy } = getCurrentInstance();
|
||||||
@ -205,6 +233,8 @@
|
|||||||
const currentLoading = ref(false);
|
const currentLoading = ref(false);
|
||||||
const logoutLoading = ref(false);
|
const logoutLoading = ref(false);
|
||||||
const loginResult = ref(null);
|
const loginResult = ref(null);
|
||||||
|
// 定义一个状态变量,默认设为 false (即默认只读/锁定,或者根据初始值判断)
|
||||||
|
const isCustomLoginUrl = ref(false);
|
||||||
|
|
||||||
const loginForm = ref({
|
const loginForm = ref({
|
||||||
loginType: 'oauth2',
|
loginType: 'oauth2',
|
||||||
@ -217,7 +247,8 @@
|
|||||||
code: '',
|
code: '',
|
||||||
state: '',
|
state: '',
|
||||||
orgAlias: '',
|
orgAlias: '',
|
||||||
sessionId: ''
|
sessionId: '',
|
||||||
|
loginUrl: ''
|
||||||
});
|
});
|
||||||
|
|
||||||
// --- 字段显示逻辑 Computed ---
|
// --- 字段显示逻辑 Computed ---
|
||||||
@ -262,6 +293,23 @@
|
|||||||
return loginForm.value.loginType === 'session_id';
|
return loginForm.value.loginType === 'session_id';
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const showLoginUrl = computed(() => {
|
||||||
|
return ['oauth2', 'legacy_credential', 'session_id'].includes(loginForm.value.loginType);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 处理下拉菜单点击
|
||||||
|
const handleLoginUrlPreset = (command) => {
|
||||||
|
if (command === 'custom') {
|
||||||
|
// 场景:用户选择了“自定义”
|
||||||
|
isCustomLoginUrl.value = true; // 解锁输入框
|
||||||
|
loginForm.loginUrl = ''; // 可选:清空当前值方便用户输入,或者保留原值
|
||||||
|
} else {
|
||||||
|
// 场景:用户选择了“生产”或“沙盒”
|
||||||
|
isCustomLoginUrl.value = false; // 锁定输入框
|
||||||
|
loginForm.loginUrl = command; // 填入预设 URL
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// --- 校验规则 ---
|
// --- 校验规则 ---
|
||||||
const rules = computed(() => {
|
const rules = computed(() => {
|
||||||
const baseRules = {
|
const baseRules = {
|
||||||
@ -310,6 +358,7 @@
|
|||||||
resetFormFields();
|
resetFormFields();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
const resetFormFields = () => {
|
const resetFormFields = () => {
|
||||||
loginForm.value.username = '';
|
loginForm.value.username = '';
|
||||||
loginForm.value.password = '';
|
loginForm.value.password = '';
|
||||||
@ -320,6 +369,7 @@
|
|||||||
loginForm.value.state = '';
|
loginForm.value.state = '';
|
||||||
loginForm.value.orgAlias = '';
|
loginForm.value.orgAlias = '';
|
||||||
loginForm.value.sessionId = '';
|
loginForm.value.sessionId = '';
|
||||||
|
loginForm.value.loginUrl = '';
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleLogin = async () => {
|
const handleLogin = async () => {
|
||||||
@ -564,6 +614,13 @@
|
|||||||
margin-top: 10px;
|
margin-top: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.form-tip {
|
||||||
|
font-size: 12px;
|
||||||
|
color: #909399;
|
||||||
|
margin-top: 4px;
|
||||||
|
line-height: 1.4;
|
||||||
|
}
|
||||||
|
|
||||||
/* 响应式调整 */
|
/* 响应式调整 */
|
||||||
@media screen and (max-width: 768px) {
|
@media screen and (max-width: 768px) {
|
||||||
.main-row {
|
.main-row {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user