# ums-server
**Repository Path**: dengd1989/ums-server
## Basic Information
- **Project Name**: ums-server
- **Description**: 统一管理系统,认证中心、用户管理、机构管理、字典管理、用户和机构同步
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 0
- **Created**: 2025-07-16
- **Last Updated**: 2026-03-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# ums-server
统一管理系统,认证中心、用户管理、机构管理、字典管理、用户和机构同步
## 主要功能简介
### 1.单点登录SSO
统一管理系统的单点登录、平台登录、鉴权等功能是通过集成Sa-Token框架实现的。Sa-Token是一个轻量级的Java权限认证框架,支持多种认证方式,包括但不限于:登录认证、权限认证、角色认证、多账号认证、临时身份认证、分布式Session会话、微服务网关鉴权等。
系统中所涉及到的接口统一返回JSON格式,内容如下:
```json
{
"code": 200,
// 状态码,200表示成功,其他表示失败
"msg": "操作成功",
// 提示信息
"data": {}
// 数据内容
}
```
#### 1.1 单点登录服务端(SSO-Server)
#### 1.1.1 应用集成模式
Sa-Token支持三种应用集成模式,在使用时根据实际情况选择:
模式一:前端同域+后端同Redis,通过共享Cookie实现;
模式二:前端不同域+后端同Redis,通过URL重定向实现,令牌验证直连Redis;
模式三:前端不同域+后端不同Redis,通过HTTP请求实现,令牌验证使用HTTP请求;
本系统各应用的集成方式为平台中心跳转模式,即用户先从sso-server登录进入平台首页,在首页上有各个子系统的进入链接,类似于钉钉,用户点击链接进入子系统(免登录)。
实现步骤如下:
1、应用先在统一管理系统中进行注册,注册时需要填写应用名称、应用地址、首页地址、推送地址等信息,统一管理系统生成授权码;
2、统一管理系统自动根据填写的地址生成应用图标点击访问地址,格式为:/sso/auth?client={client标识,即应用编码}&redirect=${子系统地址}/sso/login?back=$
{子系统首页}
3、用户登录统一管理系统后,点击应用图标,打开步骤2生成的地址,此时,统一管理系统会先重向到redirect指向的地址,并让携带Ticket票据,子系统收到Ticket后,通过消息推送接口与sso-server进行校验,校验通过后重定向到back指向的子系统首页地址.
#### 1.1.2 开放接口
##### 1.1.2.1 单点登录授权接口
接口地址:`http://{sso-server-host}:{sso-server-port}/sso/auth`
是否需要应用显示调用:否
接收参数:
| 参数名 | 是否必填 | 说明
|-----------|------|--------------------------------------------------------------------------
| redirect | 否 | 登录成功后的重定向地址,一般填写 location.href(从哪来回哪去),如不填,则跳转至 home-route
| mode | 否 | 授权模式,取值 [simple, ticket],simple=登录后直接重定向,ticket=带着ticket参数重定向,默认值为ticket
| client | 否 | 客户端标识,可不填,代表是一个匿名应用,若填写了,则校验 ticket 时也必须是这个 client 才可以校验成功
访问接口后有两种情况:
情况一:当前会话在 SSO 认证中心未登录,会进入登录页开始登录。
情况二:当前会话在 SSO 认证中心已登录,会被重定向至 redirect 地址,并携带 ticket 参数。
Ticket 码具有以下特点:
每次授权产生的 ticket 码都不一样。
ticket 码用完即废,不能二次使用。
一个 ticket 的有效期默认为五分钟,超时自动作废。
每次授权产生新 ticket 码,会导致旧 ticket 码立即作废,即使旧 ticket 码尚未使用。
##### 1.1.2.2 账号密码登录接口
接口地址:`http://{sso-server-host}:{sso-server-port}/sso/doLogin`
是否需要应用显示调用:是
接收参数:
| 参数名 | 是否必填 | 说明
|------|------|-----
| name | 是 | 用户名
| pwd | 是 | 密码
##### 1.1.2.2 单点注销接口
接口地址:`http://{sso-server-host}:{sso-server-port}/sso/signout`
是否需要应用显示调用:是
接收参数:
| 参数名 | 是否必填 | 说明
|------|------|------------------------------------------------------------
| back | 否 | 注销成功后的重定向地址,一般填写 location.href(从哪来回哪去),也可以填写 self 字符串,含义同上
##### 1.1.2.2 消息推送接口
接口地址:`http://{sso-server-host}:{sso-server-port}/sso/pusS`
是否需要应用显示调用:否,sso-client 端会自动调用此接口,向 sso-server 端推送消息。
接收参数:
| 参数名 | 是否必填 | 说明
|------------|------|------------------------------------------------------------------------------------
| client | 否 | 客户端标识,可不填,代表是一个匿名应用
| timestamp | 是 | 当前时间戳,13位
| nonce | 是 | 随机字符串
| sign | 是 | 签名,生成算法:md5( client={client值}&nonce={随机字符串}×tamp={13位时间戳}&key={secretkey秘钥} )
注意:`此接口可根据消息类型增加任意参数。新增加的参数要参与 sign 签名`。
#### 1.2 单点登录客户端(SSO-Client)
#### 1.2.1 应用集成方式
### 1.2.2 开放接口
#### 1.2.2.1 登录接口
接口地址:`http://{sso-client-host}:{sso-client-port}/sso/login`
是否需要应用显示调用:否
接收参数:
| 参数名 | 是否必填 | 说明
|--------|------|----------------------------------------
| back | 是 | 登录成功后的重定向地址,一般填写 location.href(从哪来回哪去)
| ticket | 否 | 授权 ticket 码
#### 1.2.2.1 注销接口
接口地址:`http://{sso-client-host}:{sso-client-port}/sso/logout`
是否需要应用显示调用:是
接收参数:
| 参数名 | 是否必填 | 说明
|-------|------|------------------------------------------------------------
| back | 否 | 注销成功后的重定向地址,一般填写 location.href(从哪来回哪去),也可以填写 self 字符串,含义同上
#### 1.2.2.1 注销回调接口
接口地址:`http://{sso-client-host}:{sso-client-port}/sso/logoutCall`
是否需要应用显示调用:是
接收参数:
| 参数名 | 是否必填 | 说明
|-----------|------|----------------------------------------------------------------------------------
| loginId | 是 | 要注销的账号 id
| timestamp | 是 | 当前时间戳,13位
| nonce | 是 | 随机字符串
| sign | 是 | 签名,生成算法:md5( loginId={账号id}&nonce={随机字符串}×tamp={13位时间戳}&key={secretkey秘钥} )
| client | 否 | 客户端标识,如果你在登录时向 sso-server 端传递了 client 值,那么在此处 sso-server
也会给你回传过来,否则此参数无值。如果此参数有值,则此参数也要参与签名,放在 loginId 参数前面(字典顺序)
autoLogout 否 是否为“登录client超过最大数量”引起的自动注销(true=超限系统自动注销,false=用户主动发起注销)。如果此参数有值,则此参数也要参与签名,放在
client 参数前面(字典顺序)
#### 1.2.2.1 消息推送接口
接口地址:`http://{sso-client-host}:{sso-client-port}/sso/pusC`
是否需要应用显示调用:否,sso-server 端会自动调用此接口,向 sso-client 端推送消息。
接收参数:
| 参数名 | 是否必填 | 说明
|-----------|------|-----------------------------------------------------------------
| timestamp | 是 | 时间戳,13位
| nonce | 是 | 随机字符串
| sign | 是 | 签名,生成算法:md5(nonce={随机字符串}×tamp={13位时间戳}&key={secretkey秘钥})
### 2. 子系统接入方式
参见Sa-Token官网:[单点登录之平台中心跳转模式](https://sa-token.cc/doc.html#/sso/sso-home-jump)
#### 2.1 子系统添加依赖
```xml
cn.dev33
sa-token-sso
1.43.0
cn.dev33
sa-token-forest
1.43.0
```
#### 2.2 子系统添加单点登录接口代码
```java
@RestController
public class SsoClientController {
/*
* SSO-Client端:处理所有SSO相关请求
* http://{host}:{port}/sso/login -- Client 端登录地址
* http://{host}:{port}/sso/logout -- Client 端注销地址(isSlo=true时打开)
* http://{host}:{port}/sso/pushC -- Client 端接收消息推送地址
*/
@RequestMapping("/sso/*")
public Object ssoRequest() {
return SaSsoClientProcessor.instance.dister();
}
// 配置SSO相关参数
@Autowired
private void configSso(SaSsoClientTemplate ssoClientTemplate) {
}
}
```
#### 2.3 在平台上创建应用
在平台上创建一个应用,记录下应用的标识 和 secretKey,配置如下参数:
```yaml
# sa-token配置
sa-token:
# 打印操作日志
is-log: true
# sso-client 相关配置
sso-client:
# 应用标识
client: my-app
# sso-server 端主机地址
server-url: http://sa-sso-server.com:8085
# 使用 Http 请求校验 ticket (模式三)
is-http: true
# API 接口调用秘钥
secret-key: SSO-C3-kQwIOrYvnXmSDkwEiFngrKidMcdrgKor
```
#### 2.4 登录平台后再点击链接打开子系统
平台在创建应用时,自动生成地址如下,点击时打开地址即可。
```
http://sa-sso-server.com:8085/sso/auth?client={client标识}&redirect=${子系统地址}/sso/login?back=${子系统地址}/${子系统首页地址}
```