# SSO 统一身份认证集成方案(前后端分离 CAS 模式)
## 一、方案概述
### 1.1 架构设计
采用前后端分离的 CAS 单点登录模式,流程如下:
```
用户访问 → 前端检测未登录 → 重定向到 SSO 服务端 → 用户认证
→ SSO 返回票据 → 后端验证票据 → 生成本地 Token
→ 返回前端 → 后续请求使用本地 Token
```
### 1.2 为什么需要生成本地 Token?
**原因**:
1. **性能考虑**:只需首次验证调用 SSO 服务器,后续请求本地验证
2. **解耦考虑**:SSO 短暂故障不影响已登录用户
3. **兼容性**:与现有 RuoYi 框架的 Token 机制无缝集成
4. **灵活性**:可独立管理本系统的会话和权限
**SSO 票据 vs 本地 Token**:
- SSO 票据 = 护照(跨系统通用,用于首次认证)
- 本地 Token = 身份证(系统内使用,用于会话维持)
---
## 二、前端代码实现
### 2.1 新增文件:src/api/sso.js
```javascript
import request from '@/utils/request'
/**
* 获取 SSO 登录 URL
* @param {string} redirect - 重定向地址
*/
export function getSsoLoginUrl(redirect) {
return request({
url: '/sso/loginUrl',
method: 'get',
params: { redirect },
headers: {
isToken: false
}
})
}
/**
* SSO 回调处理,验证票据并登录
* @param {Object} data - 包含 ticket 等参数
*/
export function ssoCallback(data) {
return request({
url: '/sso/callback',
method: 'post',
data: data,
headers: {
isToken: false
}
})
}
/**
* SSO 登出
*/
export function ssoLogout() {
return request({
url: '/sso/logout',
method: 'post'
})
}
```
---
### 2.2 新增文件:src/views/sso/login.vue
```vue
正在跳转到统一身份认证平台,请稍候...
如果长时间没有跳转,请检查网络连接或尝试普通登录
```
---
### 2.3 新增文件:src/views/sso/callback.vue
```vue
{{ loadingText }}
{{ loadingHint }}
```
---
### 2.4 修改文件:public/static/config.js
在文件末尾添加 SSO 配置:
```javascript
const MyConfig = {
BASE_API: 'http://localhost:8050/gd_dataserver',
FILE_BASE_URL: 'http://localhost:8050/gd_dataserver',
TEMPLATE_FILE_URL: 'http://localhost:9527/asset/template',
MQTTconnection: {
host: "bjsdqc.cn",
port: "8083",
endpoint: "/mqtt",
},
apk_url: "http://bjsdqc.cn:9527/asset/apk/gd_v1.7.2.apk",
isFlat: false,
// ========== SSO 统一身份认证配置 ==========
SSO: {
// 是否启用 SSO 登录(生产环境根据实际需求配置)
enabled: true,
// SSO 服务器基础 URL(需要根据实际 SSO 服务器地址修改)
serverUrl: 'http://localhost:8080/sso',
// 本地回调地址(前端自动获取当前域名)
callbackUrl: window.location.origin + '/sso/callback'
}
}
```
---
### 2.5 修改文件:src/views/login.vue
#### (1)导入配置文件
在 `