# 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=${子系统地址}/${子系统首页地址} ```