应用认证授权接入规范
1. 引言
1.2 目的
本规范对应用接入认证授权和单点登录提出了规范性要求。其输入是 XMagital V1.0的需求规格要求及相关子系统架构设计。该规范对平台开发应用或第三方应用的制作提出了要求,同时也是认证授权和单点登录的设计依据。
1.3 预期读者
本文档的预期读者包括:XMagital 平台软件的管理人员、设计人员、开发人员、测试人员,在 XMagital 平台基础上进行应用软件产品开发的设计人员、开发人员、测试人员、工程实施人员和维护人员。
1.4 术语与缩略语
本文使用的专业术语、自定义的词语、容易产生理解偏差的词语以及缩略语。
术语 | 解释 |
---|---|
平台 | 一个公共的基础,在此基础上可以开发不同产品。平台是产品线开发的基础,它为衍生一个产品提供可共用和可重用的特性、设计元素(组件、代码功能)以及相关流程和工具。本文中所提及的平台即 XMagital 平台。 [GB/T37413-2019 数字化车间术语和定义] |
应用 | Application,为应用软件(application software)的简称,指专为特定工程或特定生产场景编写的程序包,或本身也具有一定的通用性,但是通过 XMagital 应用开发框架编写的、并可以随时从系统摘除的软件包或模块(如签名软件,称量软件,或WMS接口程序等等)。 |
环境 | 环境即应用运行时依赖的环境。例如,Java应用依赖JRE环境、NodeJs应用依赖NodeJs环境等。 |
1.5 设计约束
假设和依赖
- 浏览器支持使用Cookie;
- 设计中所需持久化配置文件路径由HSM-SK按约定创建,HSM-Portal拥有读取权限;
- 使用OAuth2.0接入方式,对接系统遵循OAuth2.0标准协议。
2 单点登录
2.1 简介
单点登录(Single Sign-On,SSO)是一种身份验证和访问控制机制,它允许用户只需在一次身份验证后即可访问多个应用程序或系统,而无需在每个应用程序或系统中重新登录。
在传统的身份验证和授权机制中,用户需要为每个应用程序或系统提供自己的凭据(例如用户名和密码)。这可能会导致多个凭据的管理问题,并且用户需要花费额外的时间和精力来输入每个凭据。
SSO机制解决了这些问题,它基于一个共享的身份验证中心,一旦用户进行身份验证,该身份验证中心便会向所有其他系统和应用程序颁发身份验证令牌,以便用户可以无需重新登录即可访问这些系统和应用程序。
SSO机制不仅提高了用户体验,还简化了身份验证和授权管理,并增强了安全性,因为用户只需要提供凭据一次,而不需要在每个应用程序或系统中都输入凭据。
单点登录解决了以下问题:
(1) 用户无需记住多个用户名和密码:在传统的身份验证模型中,用户需要为每个应用程序都创建一个独立的帐户,并分别记住它们的用户名和密码。这对用户来说是很不方便的,也容易导致帐户密码的丢失和泄露。SSO通过一个凭证解决了这个问题,用户只需要输入一次凭证,就可以访问多个应用程序。
(2) 简化管理:传统的身份验证模型需要每个应用程序都单独管理其用户的身份验证信息。这意味着每个应用程序都需要自己的用户管理和身份验证机制,包括用户密码的存储和保护。SSO简化了这个过程,因为只需要维护一个身份验证中心,即使有多个应用程序也可以共享这个身份验证中心。
(3) 增加安全性:由于传统的身份验证模型需要在每个应用程序上存储用户密码,因此每个应用程序的安全性都非常重要。如果其中一个应用程序被攻击,所有存储在其上的密码都会泄露。使用SSO,密码只需要在一个地方存储,因此可以更加精细地管理安全性和保护用户的密码。
总之,单点登录通过提供一种统一的身份验证机制,简化了用户的身份验证过程,减少了管理和安全方面的风险,从而提高了用户体验和安全性。
2.2 接入方式
2.2.1 内部应用接入
内部应用的定义:基于平台开出的应用。当内部应用接入使用SSO身份验证机制,用户登录应用产品门户进行身份验证后,无需再在其他应用中进行身份验证就可以访问这些系统。这意味着用户只需要一组凭据(例如用户名和密码),就可以访问多个应用程序,而无需在每个应用程序中重新进行身份验证。应用产品门户聚合了所有内部应用的前端服务,所以通过在多个系统之间共享认证信息Token来实现的应用免登录。对于应用如何接入应用产品门户、应用产品门户如何将用户认证信息Token传递给应用等问题,可参见统一门户接入规范文档,本文不做赘述。
应用接入单点登录需要依赖权限认证服务进行应用接入配置,启动Auth服务使用应用管理模块添加应用信息。
接入SSO的整个过程,如下图:
(1) 用户打开应用产品门户地址,首先应用产品门户前端调用SSO授权接口,如果当前会话在SSO认证中心未登录,由应用产品门户打开登录页开始登录。若当前会话在SSO认证中心已登录,会返回用户登录凭证token,应用产品门户打开首页。
(2) 若用户未登录,需要在应用产品门户登录页输入用户名、密码,应用产品门户前端调用SSO登录接口,若系统未开启双因子认证,登录成功返回Token参数(使用JWT方式生成),应用产品门户前端需要把该参数共享给集成的应用。若系统开启双因子认证,登录成功则返回双因子认证的方式,由前端登录页打开相应双因子认证的页面,调用SSO双因子认证接口完成登录。详情见下图:
(3) 用户在应用产品门户前端页面点击应用的图标时,应用前端可以直接调用SSO获取用户信息接口,也可以通过应用后端调用SSO接口,Token合法时会返回用户信息。当应用后端通过api方式调用,且Token校验非法,会收到http状态码401。
(4) 对于用户注销,通过调用SSO注销接口即可。
对于内部应用,不需要使用单点登录机制,只需要简单的登录、退出等功能的场景,可使用应用产品门户提供的登录页面组件,调用SSO服务的相关api完成登录退出等操作,该场景可选择不依赖Auth服务提供的应用配置功能。对于Token过期、长时间位操作自动退出、刷新Token等问题,可由应用产品门户调用SSO服务的相关接口完成,应用无需关心。
2.2.2 外部应用接入
外部应用的定义:完全跟平台没有关系的应用,对于外部应用接入,使用OAuth2.0协议进行登录授权,该方式同样为SSO-server提供。OAuth2.0是一个用于授权的开放标准协议,它允许用户授权第三方应用程序(如社交媒体应用程序)访问他们的受保护资源(如照片、视频等)。OAuth2.0的主要目的是为了减少用户在第三方应用程序和资源服务提供者之间共享凭证的需求,从而提高安全性并减少安全风险。
OAuth2.0 的主要组成部分:
- 授权服务器:用于管理用户授权的服务器,验证用户身份并颁发访问令牌。
- 资源服务器:存储和管理受保护的资源。
- 客户端应用程序:代表用户请求访问受保护资源的应用程序。
- 访问令牌:由授权服务器颁发给客户端应用程序,用于访问资源服务器中受保护的资源。
- 刷新令牌:用于更新访问令牌,以便客户端应用程序可以持续访问受保护的资源。
SSO服务提供OAuth2.0标准授权步骤,Server端向Client端下放Code码,Client端再用Code码换取授权Token,即授权码(Authorization Code)模式。
(1) 接口说明
(2) SSO单点登录接口
(3) 单点登录授权
- 接口地址
URL | {Server}/sso/auth |
---|---|
http请求方式 | get |
访问接口后有两种情况:
-
情况一:当前会话在SSO认证中心未登录,由应用产品门户打开登录页开始登录。
-
情况二:当前会话在SSO认证中心已登录,返回用户登录凭证token。
-
接收参数说明:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
Authorization | String | 否 | 用户登录后返回的登录令牌,同时支持header传递和query参数传递。特别注意header传递时的格式为:前缀为Bear加空格 |
- 返回值参数说明:
参数 | 类型 | 是否可为空 | 描述 |
---|---|---|---|
token | String | 否 | 用户登录凭证 |
expires | Long | 否 | Token剩余有效期,单位秒 |
-
示例介绍
-
已登录时
{
"code": 0, //当前会话用户已登录
" message": "SUCCESS",
"timestamp": 1605778520744,
"data": {
"token": 7Ngo1Ig6JpPzPO2i3PVpEV..., //
"expires": 7199 //
}
}
- 未登录时
{
"code": 1010101,
" message": "login required",
"timestamp": 1605778520744,
"data": null
}
(4) 登录接口
- 接口地址
URL | {Server}/sso/dologin |
---|---|
http请求方式 | post |
- 接收参数说明:
参数 | 是否必填 | 说明 |
---|---|---|
name | 是 | 用户名 |
pwd | 是 | 密码(使用信安院提供的加密方式) |
loginclient | 否 | 登录客户端,默认为WEB,`APP`为移动端,`DESKTOP`为桌面端 |
-
若系统未开启双因子认证,登录成功后返回本次登录的Token值,Token使用JWT的方式生成。
-
返回值参数说明:
参数 | 类型 | 是否可为空 | 描述 |
---|---|---|---|
token | String | 否 | 用户登录凭证 |
expires | Long | 否 | Token剩余有效期,单位秒 |
scope | String | 否 | 此令牌包含的权限 |
userinfo | Object | 否 | 用户信息 |
-
示例介绍
-
登录成功时
{
"code": 0,
" message": "success",
"timestamp": 1605778520744,
"data": {
"token": 7Ngo1Ig6JpPzPO2i3PVpEV...,
"expires": 7199, //
"scope": null,
"userinfo": {}
}
}
- 登录失败时
{
"code": 1010102,
" message": "login failed",
"timestamp": 1605778520744,
"data": null
}
-
若系统开启双因子认证,登录成功则返回双因子认证的方式,由前端登录页打开相应双因子认证的页面。
-
返回值参数说明:
参数 | 类型 | 是否可为空 | 描述 |
---|---|---|---|
data | String | 否 | 双因子认证方式:MAIL(邮箱)、NOTE(短信)、QR(扫码)、OTP(一次一密)、SP(二次密码) |
-
示例介绍
-
登录成功时
{
"code": 1010103,
" message": "success",
"timestamp": 1605778520744,
"data": "mailbox"
}
- 登录失败时
{
"code":1010102,
" message": "login failed",
"timestamp": 1605778520744,
"data": null
}
(5) 双因子认证接口(以邮箱为例)
- 接口地址
URL | {Server}/sso/secure |
---|---|
http请求方式 | post |
- 接收参数说明:
参数 | 是否必填 | 说明 |
---|---|---|
name | 是 | 用户名 |
code | 是 | 验证码 |
- 返回值参数说明:
参数 | 类型 | 是否可为空 | 描述 |
---|---|---|---|
token | String | 否 | 用户登录凭证 |
expires | Long | 否 | Token剩余有效期,单位秒 |
scope | String | 否 | 此令牌包含的权限 |
userinfo | Object | 否 | 用户信息 |
-
示例介绍
-
登录成功时
{
"code": 0,
"message": "success",
"timestamp": 1605778520744,
"data": {
"token": 7Ngo1Ig6JpPzPO2i3PVpEV...,
"expires": 7199, //
"scope": null,
"userinfo": {}
}
}
- 登录失败时
{
"code":1010104,
" message": "failed",
"timestamp": 1605778520744,
"data": null
}
(6) 注销接口
-
形如:/sso/logout
-
接受参数:
参数 | 是否必填 | 说明 |
---|---|---|
Authorization | 是 | 用户登录凭证 |
-
返回值场景:
-
注销成功时
{
"code":0,
" message": "success",
"timestamp": 1605778520744,
"data": null
}
- 注销失败时
{
"code":1010105,
" message": "token lllegal",
"timestamp": 1605778520744,
"data": null
}
(7) Token校验接口
- 接口地址
URL | {Server}/sso/checktoken |
---|---|
http请求方式 | get |
- 接收参数说明:
参数 | 是否必填 | 说明 |
---|---|---|
Authorization | 是 | 登录令牌 |
- 返回值参数说明:
参数 | 类型 | 是否可为空 | 描述 |
---|---|---|---|
token | String | 否 | 用户登录凭证 |
expires | Long | 否 | Token剩余有效期,单位秒 |
-
示例介绍:
-
校验成功时
{
"code": 0,
"message": "right token ",
"timestamp": 1605778520744,
"data": {
"token": 7Ngo1Ig6JpPzPO2i3PVpEV...,
"expires\in": 7199 //
}
}
- 校验失败时
{
"code":1010106,
"message": "token lllegal",
"timestamp": 1605778520744,
"data": null
}
(8) 刷新Token接口
- 接口地址
URL | {Server}/sso/refresh |
---|---|
http请求方式 | get |
- 接收参数说明:
参数 | 是否必填 | 说明 |
---|---|---|
Authorization | 是 | 登录令牌 |
- 返回值参数说明:
参数 | 类型 | 是否可为空 | 描述 |
---|---|---|---|
token | String | 否 | 用户登录凭证 |
expires | Long | 否 | Token剩余有效期,单位秒 |
-
示例介绍:
-
校验成功时
{
"code":0,
"message": "success",
"timestamp": 1605778520744,
"data": {
"token": 7Ngo1Ig6JpPzPO2i3PVpEV...,
"expires\in": 7199,
}
}
- 校验失败时
{
"code":1010107,
" message": "token lllegal",
"timestamp": 1605778520744,
"data": null
}
(9) 获取 Userinfo
- 接口地址
URL | {Server}/sso/userinfo |
---|---|
http请求方式 | get |
- 接收参数说明:
参数 | 是否必填 | 说明 |
---|---|---|
Authorization | 是 | 登录令牌 |
- 返回值参数说明:
参数 | 类型 | 是否可为空 | 描述 |
---|---|---|---|
token | String | 否 | 用户登录凭证 |
expires | Long | 否 | Token剩余有效期,单位秒 |
scope | String | 否 | 此令牌包含的权限 |
userinfo | Object | 否 | 用户信息 |
-
示例介绍:
-
成功时
{
"code": 0,
" message": "success",
"timestamp": 1605778520744,
"data": {
"token": 7Ngo1Ig6JpPzPO2i3PVpEV...,
"expires\in": 7199, //
"scope": null, //
"userinfo": {
"id":"23bc0065cc4a11edbdf2e0be033383f6", // 账号id
"name": "zhangsan", // 账号
// 省略......
"state": 1, // 账号状态(1=正常,2=封禁)
"createBy": "2022-06-01 10:28:12" // 注册时间
} //用户信息
}
}
- 失败时
{
"code":1010108,
" message": "token lllegal",
"timestamp": 1605778520744,
"data": null
}
(10) Oauth2.0接口
(11) 获取授权码
- 接口地址
URL | {Server}/oauth2/authorize |
---|---|
http请求方式 | get |
- 接收参数说明:
参数 | 是否必填 | 说明 |
---|---|---|
response\typeredirectUri | 是 | 用户确认授权后,重定向的url地址返回类型,此处的值固定为”code” |
client\iId | 是 | 应用id |
redirect\uriapplicationCode | 是 | 应用code用户确认授权后,重定向的url地址 |
scope | 否 | 具体请求的权限,多个用逗号隔开 |
state | 否 | 随机值,此参数会在重定向时追加到url末尾,不填不追加 |
- 注意点:
1)如果用户在Server端尚未登录:会被转发到登录视图
2)如果scope参数为空,或者请求的权限用户近期已确认过,则无需用户再次确认,达到静默授权的效果,否则需要用户手动确认,服务器才可以下放code授权码
-
用户确认授权之后,会被重定向至redirect\uri,并追加code参数与state参数,形如:redirect\uri?code={code}&state={state}
-
Code授权码具有以下特点:
-
每次授权产生的Code码都不一样
-
Code码用完即废,不能二次使用
-
一个Code的有效期默认为五分钟,超时自动作废
-
3)每次授权产生新Code码,会导致旧Code码立即作废,即使旧Code码尚未使用
4)根据授权码获取Access-Token
-
获得Code码后,我们可以通过以下接口,获取到用户的Access-Token、Refresh-Token关键信息
-
接口地址
URL | {Server}/oauth2/token |
---|---|
http请求方式 | postget |
- 接收参数说明:
参数 | 是否必填 | 说明 |
---|---|---|
grant\type | 是 | 授权类型,这里请填写:authorization\code |
client\idcookie | 是 | 应用idcookie |
client\secretAuthorization | 是否 | 应用秘钥刷新token,可选填 |
code | 是 | 步骤一中获得到的授权码 |
- 返回值参数说明:
参数 | 类型 | 是否可为空 | 描述 |
---|---|---|---|
access\token | String | 否 | Access-Token值 |
refresh\token | String | 否 | Refresh-Token值 |
access\token \expires | Long | 否 | Access-Token剩余有效期,单位秒 |
refresh\token\expires | String | 否 | Refresh-Token剩余有效期,单位秒 |
client\id | String | 否 | 应用id |
scope | 否 | 此令牌包含的权限 |
- 示例介绍:
{
"code": 0,
"message": "success",
"timestamp": 1605778520744,
"data": {
"access\token": "7Ngo1Ig6JpPzPO2i3PVpEVJXXXXXXXXX",
"refresh\token": "ZMG7Q3ARA4rbmeR66",
" access\token\expires expires": "1h "7199,
"refresh\token": "ZMG7Q3ARA4rbmeR66XXXXXXXXX",
"refresh\token\expires": "1h "
2591999,//Refresh-Token剩余有效期,单位秒
"client\id": "1001", // 应用id
"scope": "userinfo" // 此令牌包含的权限
}
}
5)根据 Refresh-Token 刷新 Access-Token
- Access-Token的有效期较短,如果每次过期都需要重新授权的话,会比较影响用户体验,因此我们可以在后台通过Refresh-Token刷新Access-Token
- 接口地址:
URL | {Server}/oauth2/refresh |
---|---|
http请求方式 | postget |
- 接收参数说明:
参数 | 是否必填 | 说明 |
---|---|---|
cookiegrant\type | 是是 | cookie授权类型,这里请填写:refresh\token |
Authorizationclient\id | 是是 | 刷新token应用id |
client\secret | 是 | 应用秘钥 |
refresh\token | 是 | 上步骤中获得到的Refresh-Token值 |
- 返回值:同上
6) 根据 Access-Token 获取相应用户的账号信息
- 接口地址:
URL | {Server}/oauth2/userinfo |
---|---|
http请求方式 | post |
- 接收参数说明:
参数 | 是否必填 | 说明 |
---|---|---|
access\token | 是 | Access-Token值 |
- 返回值参数说明:
参数 | 类型 | 是否可为空 | 描述 |
---|---|---|---|
name | String | 否 | 账号昵称 |
avatar | String | 是 | 头像地址 |
- 示例介绍:
{
"code": 0,
" message": "ok",
"timestamp": 1605778520744,
"data": {
"name": "shengzhang\",
"avatar": "http://xxx.com/1.jpg"
...
}
}
3. 权限管理
3.1 简介
3.1.1 概述
HSM-Auth的目标是为平台的开发、工程、运行、运维环境,以及平台上的所有应用提供一套统一的用户认证及权限管理服务。
在任何工厂现场,系统登录用户必须经过认证和授权,才能访问系统中特定部分的功能。应用页面及服务获得授权的过程称为访问控制。
安全的两个基本方面是认证和授权。在输入凭证登录电脑或登录应用程序或软件后,设备或应用程序会进行身份验证,以确定授权级别。授权包括可以使用哪些账户,可以访问哪些资源,以及允许执行哪些功能。
系统中的资源简单概括为静态资源(功能操作、数据列)和动态资源(数据),也分别称为对象资源和数据资源,系统的目标就是对应用系统的所有对象资源和数据资源进行权限控制,比如应用系统的功能菜单、各个界面的按钮、数据显示的列以及各种行级数据进行权限的操控。
3.1.2 总体框架
下面对上图进行说明:
-
接入层:接入层表示权限接入方,分为前端接入和后端接入,前端接入通过应用门户(Portal)、页面集成、自行实现页面和直接使用权限页面4种方式接入,后端通过中间件SDK、代理服务、网关服务接入或直接接入4种方式接入。
-
权限层:权限基于Casbin实现权限模型加载及权限控制。
-
数据层:使用DB服务/关系数据库持久化数据,使用缓存数据库缓存数据
-
RBAC(用户 – 角色 – 对象):基于角色的访问控制是一种围绕角色和权限定义的策略中立的访问控制机制。
3.1.3 权限类型
菜单/按钮权限:管控用户的菜单/按钮的访问权限
API权限:管控用户/应用的API接口访问权限
数据权限:权限通过数据组的方式来管控用户的数据访问权限,权限负责维护角色和数据组的关系,使用方维护具体的数据权限。数据用户组支持如下5种类型:
- 当前组织
- 当前岗位
- 当前用户
- 规则配置
- 扩展支持
其中当前组织、当前岗位、当前用户无需特殊配置,规则配置需在权限的数据组功能中增加规则相关配置,扩展支持需使用方自行维护数据组和扩展内容的关系。
当前组织、当前岗位、当前用户和规则配置的数据权限由DB/使用方支持。扩展支持的数据权限由使用方自行支持。
范围说明
权限维度 | 权限范围 |
---|---|
公司 | * 每个公司仅可操作自己公司下的用户、用户组、角色 |
角色 | 角色关联资源,以应用为维度授权以下权限 _ 菜单/按钮权限 _ API权限 * 数据权限 |
用户 | * 用户的权限只和用户角色相关,故用户的权限为用户所拥有角色的权限合集。 |
应用 | * 应用权限范围为各应用间调用使用,暂只支持API权限。 |
3.1.4 接入说明
接入方式
(1)前端接入方式
前端接入方式选择如上图:
1)首先需确定使用方前端页面是否接入应用门户(Portal),若接入,则接入方无需处理,由应用门户(Portal)整合权限页面;
2)若使用方前端未接入应用门户(Portal),则需要确定使用方是否使用权限页面,若不使用,则需要接入方自行开发页面通过接口接入权限系统;若使用权限页面,则需要确认接入方是否支持前端页面集成,若支持,建议使用方需通过iframe等形式集成权限提供的页面接入权限系统,反之使用方直接使用权限提供的页面服务。
Portal接入 | 页面集成接入 | 直接使用接入 | 自行实现接入 | |
---|---|---|---|---|
优势 | 无需关心【登录认证&权限管理】相关功能,由Portal集成 | 无需Portal,通过集成权限相关页面完成【登录认证&权限管理】相关功能 | 无需Portal/页面集成,直接使用【登录认证&权限管理】相关功能 | 无需权限前端页面,B端/C端等均可接入 |
缺点 | 需B端接入,需集成Portal,无法单独访问 | 需B端接入,需集成权限相关页面,需处理菜单等资源展示 | 需B端接入,需接入单点登录,需处理菜单等资源展示 | 需自行实现权限相关页面,通过接口接入权限系统 |
(2)后端接入方式
后端接入方式选择如上图:
1)首选需确认接入方后端是否接入中间件,如未接入,则通过直接接入方式接入即可;
2)若接入方后端接入中间件,则需要确认是否基于中间件提供的SDK开发,若通过SDK开发,则通过SDK方式接入权限系统,若基于中间件的代理服务接入,则通过代理接入权限系统,反之通过中间件提供的网关服务接入权限系统。
中间件 - SDK接入 | 中间件 - 代理接入 | 中间件 - 网关接入 | 直接接入 | |
---|---|---|---|---|
优势 | 通过中间件接入的,无需关注API权限过滤,请求方通过中间件调用时系统,中间件负责处理API权限 | 无需中间件,可直接接入权限系统 | ||
缺点 | 需通过中间件提供的SDK开发应用 | 需通过中间件提供的代理服务接入权限,增加了网络消耗 | 需通过Restful/Graphql等方式接入权限 | 需自行处理API权限,需通过Restful/Graphql等方式接入权限 |
(3)接入支持
1)应用接入支持
应用配置有如下两种方式
-
界面配置
- 添加应用
- 配置模块信息
- 配置菜单资源
- 配置API资源
- 配置数据资源
-
初始化导入:
- 通过开发环境(DEV)等开发的应用打包时将应用、资源等相关信息通过权限提供的导出接口,导出为文件打入到安装包内,应用安装时通过导入接口导入对应的应用、资源等信息。
- 若上述方式不适用,则需要依据提供的导入模版(excel/csv)将资源信息填入后,导入权限系统。
2)模块扩展支持
当有新模块需要权限支持时,请参考以下操作流程:
- 应用管理中增加模块信息
- 配置模块资源信息
-
菜单/按钮资源
- API资源
- 数据资源
- 配置角色资源权限
- 获取用户权限信息
- 根据用户权限信息控制页面展示内容
(4)功能范围
(5) 应用管理
应用管理支持对内部应用及第三方应用的认证授权、资源管理,操作权限进行接入并管理。应用管理除提供界面的方式外,还提供了操作接口,在通过部署工具安装应用时,可同步接收应用信息,减少应用的录入工作。示例图如下:
1)模块管理
模块管理是应用的功能模块,模块管理关联菜单、API和数据资源。示例图如下:
2)资源管理
资源类型包括菜单、页面、接口、操作等,可以对资源项的具体操作进行配置,为用户权限管理提供基础。
- 菜单资源
维护左侧菜单树、页面及页面上的按钮组。示例图如下:
- API资源
维护系统中的API资源,可从中间件同步或手动添加。示例图如下:
- 数据资源
以数据组方式维护数据资源,每个数据组可以配置不同的权限类型。示例图如下:
3)公司管理
公司管理旨在隔离用户/角色/用户组等数据,内置默认公司,公司是树状结构,支持层级管理,子公司的用户/角色/用户组只能使用子公司管理员维护。示例图如下:
4)用户管理
为系统进行用户的配置,为用户权限和认证的处理提供基础。示例图如下:
5)角色管理
角色是用户和权限连接的桥梁,角色是权限的集合,可以在系统中管理角色信息。在用户管理中,可同时为用户分配角色以支持特定的权限操作。示例图如下:
3.1.5 用户令牌管理
管理静态用户令牌,使用场景:
- 硬件接入
创建设备用户,生成设备专属令牌。
示例图如下:
在线用户
管理当前正在使用的用户,可以强制退出。示例图如下:
3.1.6 订阅接口管理
认证授权服务的用户、用户组、角色、登录策略发生变化时,允许其它应用或服务通过注册的订阅接口获得变化通知。示例图如下:
3.1.7 基本设置
(1)密码配置
配置密码相关安全策略,例如:密码复杂度、密码长度等。示例图如下:
(2)登录配置
配置登录相关安全策略,例如:双因子认证、LDAP登录等。示例图如下:
(3)LDAP配置
配置LDAP服务器,有且仅有一个,保证LDAP服务器中的用户与系统中用户同步。示例图如下:
(4)操作管理
操作管理用来维护系统中所有操作按钮,供菜单资源管理中的操作分组功能使用。示例图如下:
3.1.8 权限控制说明
权限控制说明
访问内部应用 | 访问外部应用 | 内部应用间访问/三方应用访问内部应用 | 外部应用间访问 | |
---|---|---|---|---|
菜单权限 | 接入Portal情况下,由Portal控制;未接入Portal情况下,需使用方查询用户菜单权限由前端控制菜单/按钮是否展示 | 查询用户菜单权限由三方前端控制菜单/按钮是否展示 | 不涉及 | 不涉及 |
API权限 | SDK/代理/网关接入时,API权限由中间件直接控制;直接接入时,API权限需使用方查询用户API权限后自己做权限控制 | 查询用户API权限由三方后端做权限控制 | SDK/代理/网关接入时,API权限由中间件直接控制;直接接入时,API权限需被调用方方查询调用方API权限后自己做权限控制 | 查询调用方API权限由被调用方后端自己做权限控制 |
数据权限 | SDK/代理/网关接入时,数据权限由中间件作为桥梁查询用户数据权限后传递到DB来控制;直接接入时,数据权限需使用方查询用户数据权限后自己做权限控制 | 查询用户数据权限由三方后端做权限控制 | 暂不涉及 | 暂不涉及 |
3.1.9 权限资源维护
应用维护支持以下三种方式:
- 通过产品门户界面维护
- 通过调用API接口维护
- 通过接入网关/中间件方式自动添加
菜单/按钮维护支持以下两种方式:
- 通过产品门户界面维护
- 通过调用API接口维护
API接口维护支持以下三种方式:
- 通过产品门户界面维护
- 通过调用API接口维护
- 通过接入网关/中间件方式自动添加
数据组维护支持以下两种方式:
- 通过产品门户维护
- 通过调用API接口维护
注:
(1)若数据组选择权限类型为当前组织/当前岗位/当前用户,则数据提供方需维护数据与上述属性的关联性
(2)若数据组选择权限类型为规则配置,则数据提供方需提前确定哪些规则允许自定义添加,防止规则配置引起的问题
(3)若数据组选择权限类型为自定义扩展,则数据提供方需自行维护扩展内容和数据组的关系,权限服务不做干涉
3.2 权限资源授权
菜单资源:通过门户界面授权角色菜单/按钮权限
API资源:通过门户界面授权角色API权限
数据组资源:通过门户界面授权角色数据组权限
注:数据组自定义扩展内容由数据提供方维护
(1)权限验证
1)菜单/按钮权限
菜单权限验证如上图:
- 权限服务负责保存/获取用户权限信息,并提供用户权限缓存机制)
- 网关服务负责将用户权限信息透传至调用方,未接入网关的情况下由权限直接返回用户权限信息返回至调用方
- 产品门户负责根据用户权限信息,展示对应的内部应用、菜单及按钮信息等
- 三方应用需根据用户权限信息,自行控制展示内容
2)API权限
API权限验证如上图:
- 权限服务负责保存/获取用户权限信息,并提供用户权限缓存机制,被调用方未接入网关时,权限提供API接口的权限验证,验证方式如下
- 先验证是否是白名单接口,若是,则直接放行,若不是则根据用户权限信息判定是否有该接口的访问权限,有则放行,反之返回无权限
- 被调用方接入网关服务时,调用方通过网关访问,网关服务直接从权限服务获取调用方权限信息,依据上述验证方式验证调用方权限,无需在权限服务验证
3.3 数据权限
数据权限验证如上图:
- 权限服务负责保存/获取用户数据组权限信息,并提供用户权限缓存机制,数据提供方未接入网关时,由数据提供方调用权限服务查询当前调用方的数据组权限信息,在自行依据数据组查询调用方有权限的数据信息
- 数据提供方接入网关/中间件时,数据提供方需通过网关/中间件服务查询当前调用方的数据组权限信息,在自行依据数据组查询调用方的有权限数据信息,并通过网关透传数据至调用方
- 接口说明
- Graphql接口
所有的Graphql共用如下信息
-
接口地址:/graphql
- 请求方式:POST
- 请求数据类型: application/json
用户管理接口
添加用户信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
createOneUserInfo
- 请求参数 请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
data | UserInfoCreateInput | 是的 | 用户信息 |
- 请求示例
mutation {
createOneUserInfo(data: UserInfoCreateInput!) {
id
account
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— createOneUserInfo | Object | 响应对象。 |
返回示例
{
"data": {
"createOneUserInfo": {
"id": "1747b011cc6411edbdf2e0be033383f6",
"account": "zhangsan"
}
}
}
编辑用户信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
updateOneUserInfo
- 请求参数
请求参数说明
字段 | 类型 | 必填 | 描述 |
---|---|---|---|
data | UserInfoUpdateInput | 是的 | 用户信息 |
where | UserInfoWhereUniqueInput | 是的 | 条件信息 |
- 请求示例
mutation {
updateOneUserInfo(data: UserInfoUpdateInput!, where: UserInfoWhereUniqueInput) {
id
account
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— updateOneUserInfo | Object | 响应对象。 |
返回示例
{
"data": {
"updateOneUserInfo": {
"id": "46c108dccc6411edbdf2e0be033383f6",
"account": "zhangsan"
}
}
}
删除用户信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
deleteManyUserInfo
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
where | UserInfoWhereInput | 是的 | 条件信息 |
- 请求示例
mutation {
deleteManyUserInfo(where: UserInfoWhereInput!) {
count
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— deleteManyUserInfo | Object | 响应对象。 |
返回示例
{
"data": {
"deleteManyUserInfo": {
"count": 1
}
}
}
查询用户信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
findManyUserInfo
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
where | UserInfoWhereInput | 否 | 条件信息 |
orderBy | UserInfoOrderByWithRelationInput | 否 | 排序信息 |
cursor | UserInfoWhereUniqueInput | 否 | 指定列表的位置(该值通常指定一个或其他唯一值)。id |
take | Int | 否 | 指定应在列表中返回多少个对象(从列表的开头(正值)或结尾(负值)或位置(如果提到)查看)cursor |
skip | Int | 否 | 跳过 |
distinct | UserInfoScalarFieldEnum | 否 | 去重 |
- 请求示例
query {
findManyUserInfo (where: UserInfoWhereInput, orderBy: UserInfoOrderByWithRelationInput, cursor: UserInfoWhereUniqueInput, take: Int, skip: Int, distinct: UserInfoScalarFieldEnum) {
id
account
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— findManyUserInfo | Object | 响应对象。 |
返回示例
{
"data": {
"findManyUserInfo": {
"id": "afa7bf6ccc6411edbdf2e0be033383f6",
"account": "string"
}
}
}
锁定用户接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
lockManyUserInfo
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
where | UserInfoWhereUniqueInput | 是的 | 条件信息 |
- 请求示例
mutation {
lockManyUserInfo (where: UserInfoWhereUniqueInput!) {
count
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— lockManyUserInfo | Object | 响应对象。 |
返回示例
{
"data": {
"lockManyUserInfo": {
"count": 1
}
}
}
解锁用户接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
unlockManyUserInfo
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
where | UserInfoWhereUniqueInput | 是的 | 条件信息 |
请求示例
mutation {
unlockManyUserInfo (where: UserInfoWhereUniqueInput!) {
count
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— unlockManyUserInfo | Object | 响应对象。 |
返回示例
{
"data": {
"unlockManyUserInfo": {
"count": 1
}
}
}
查询用户权限接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
permissionOneUserInfo
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
where | UserInfoWhereUniqueInput | 是 | 条件信息 |
请求示例
query {
permissionOneUserInfo (where: UserInfoWhereUniqueInput!) {
id
account
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— permissionOneUserInfo | Object | 响应对象。 |
返回示例
{
"data": {
"permissionOneUserInfo": {
"id": "afa7bf6ccc6411edbdf2e0be033383f6",
"account": "zhangsan"
}
}
}
用户组管理接口
添加用户组信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
createOneUserGroupInfo
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
data | UserGroupInfoCreateInput | 是的 | 用户信息 |
请求示例
mutation {
createOneUserGroupInfo(data: UserGroupInfoCreateInput!) {
id
code
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— createOneUserGroupInfo | Object | 响应对象。 |
返回示例
{
"data": {
"createOneUserGroupInfo": {
"id": "1747b011cc6411edbdf2e0be033383f6",
"code": "zhangsan"
}
}
}
编辑用户组信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
updateOneUserGroupInfo
- 请求参数
请求参数说明
字段 | 类型 | 必填 | 描述 |
---|---|---|---|
data | UserGroupInfoUpdateInput | 是的 | 用户信息 |
where | UserGroupInfoWhereUniqueInput | 是的 | 条件信息 |
请求示例
mutation {
updateOneUserGroupInfo(data: UserGroupInfoUpdateInput!, where: UserGroupInfoWhereUniqueInput) {
id
code
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— updateOneUserGroupInfo | Object | 响应对象。 |
返回示例
{
"data": {
"updateOneUserGroupInfo": {
"id": "46c108dccc6411edbdf2e0be033383f6",
"code": "zhangsan"
}
}
}
删除用户组信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
deleteManyUserGroupInfo
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
where | UserGroupInfoWhereInput | 是的 | 条件信息 |
请求示例
mutation {
deleteManyUserGroupInfo(where: UserGroupInfoWhereInput!) {
count
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— deleteManyUserGroupInfo | Object | 响应对象。 |
返回示例
{
"data": {
"deleteManyUserGroupInfo": {
"count": 1
}
}
}
查询用户组信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
findManyUserGroupInfo
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
where | UserGroupInfoWhereInput | 否 | 条件信息 |
orderBy | UserGroupInfoOrderByWithRelationInput | 否 | 排序信息 |
cursor | UserGroupInfoWhereUniqueInput | 否 | 指定列表的位置(该值通常指定一个或其他唯一值)。id |
take | Int | 否 | 指定应在列表中返回多少个对象(从列表的开头(正值)或结尾(负值)或位置(如果提到)查看)cursor |
skip | Int | 否 | 跳过 |
distinct | UserGroupInfoScalarFieldEnum | 否 | 去重 |
请求示例
query {
findManyUserGroupInfo (where: UserGroupInfoWhereInput, orderBy: UserGroupInfoOrderByWithRelationInput, cursor: UserGroupInfoWhereUniqueInput, take: Int, skip: Int, distinct: UserGroupInfoScalarFieldEnum) {
id
code
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— findManyUserGroupInfo | Object | 响应对象。 |
返回示例
{
"data": {
"findManyUserGroupInfo": {
"id": "afa7bf6ccc6411edbdf2e0be033383f6",
"code": "string"
}
}
}
关联用户接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
updateManyUserGroupItem
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
data | UserGroupItemUpdateManyMutationInput | 是的 | 用户组关联用户信息 |
where | UserGroupItemWhereInput | 是的 | 条件 |
请求示例
mutation {
updateManyUserGroupItem (data: UserGroupItemUpdateManyMutationInput!, where: UserGroupItemWhereInput) {
count
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— updateManyUserGroupItem | Object | 响应对象。 |
返回示例
{
"data": {
"updateManyUserGroupItem": {
"count": 1
}
}
}
解除关联用户接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
deleteManyUserGroupItem
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
where | UserGroupItemWhereInput | 是的 | 条件信息 |
请求示例
mutation {
deleteManyUserGroupItem (where: UserGroupItemWhereInput!) {
count
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— deleteManyUserGroupItem | Object | 响应对象。 |
返回示例
{
"data": {
"deleteManyUserGroupItem": {
"count": 1
}
}
}
查询关联用户接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
findManyUserGroupItem
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
where | UserGroupItemWhereInput | 否 | 条件信息 |
orderBy | UserGroupItemOrderByWithRelationInput | 否 | 排序信息 |
cursor | UserGroupItemWhereUniqueInput | 否 | 指定列表的位置(该值通常指定一个或其他唯一值)。id |
take | Int | 否 | 指定应在列表中返回多少个对象(从列表的开头(正值)或结尾(负值)或位置(如果提到)查看)cursor |
skip | Int | 否 | 跳过 |
distinct | UserGroupItemScalarFieldEnum | 否 | 去重 |
请求示例
query {
findManyUserGroupItem (where: UserGroupItemWhereInput, orderBy: UserGroupItemOrderByWithRelationInput, cursor: UserGroupItemWhereUniqueInput, take: Int, skip: Int, distinct: UserGroupItemScalarFieldEnum) {
id
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— findManyUserGroupItem | Object | 响应对象。 |
返回示例
{
"data": {
"findManyUserGroupItem": {
"id": "afa7bf6ccc6411edbdf2e0be033383f6"
}
}
}
角色管理接口
添加角色信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
createOneRoleInfo
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
data | RoleInfoCreateInput | 是的 | 用户信息 |
请求示例
mutation {
createOneRoleInfo(data: RoleInfoCreateInput!) {
id
code
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— createOneRoleInfo | Object | 响应对象。 |
返回示例
{
"data": {
"createOneRoleInfo": {
"id": "1747b011cc6411edbdf2e0be033383f6",
"code": "role1"
}
}
}
编辑角色信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
updateOneRoleInfo
- 请求参数
请求参数说明
字段 | 类型 | 必填 | 描述 |
---|---|---|---|
data | RoleInfoUpdateInput | 是的 | 用户信息 |
where | RoleInfoWhereUniqueInput | 是的 | 条件信息 |
请求示例
mutation {
updateOneRoleInfo(data: RoleInfoUpdateInput!, where: RoleInfoWhereUniqueInput) {
id
code
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— updateOneRoleInfo | Object | 响应对象。 |
返回示例
{
"data": {
"updateOneRoleInfo": {
"id": "46c108dccc6411edbdf2e0be033383f6",
"code": "role1"
}
}
}
删除角色信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
deleteManyRoleInfo
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
where | RoleInfoWhereInput | 是的 | 条件信息 |
请求示例
mutation {
deleteManyRoleInfo(where: RoleInfoWhereInput!) {
count
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— deleteManyRoleInfo | Object | 响应对象。 |
返回示例
{
"data": {
"deleteManyRoleInfo": {
"count": 1
}
}
}
查询角色信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
findManyRoleInfo
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
where | RoleInfoWhereInput | 否 | 条件信息 |
orderBy | RoleInfoOrderByWithRelationInput | 否 | 排序信息 |
cursor | RoleInfoWhereUniqueInput | 否 | 指定列表的位置(该值通常指定一个或其他唯一值)。id |
take | Int | 否 | 指定应在列表中返回多少个对象(从列表的开头(正值)或结尾(负值)或位置(如果提到)查看)cursor |
skip | Int | 否 | 跳过 |
distinct | RoleInfoScalarFieldEnum | 否 | 去重 |
请求示例
query {
findManyRoleInfo (where: RoleInfoWhereInput, orderBy: RoleInfoOrderByWithRelationInput, cursor: RoleInfoWhereUniqueInput, take: Int, skip: Int, distinct: RoleInfoScalarFieldEnum) {
id
code
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— findManyRoleInfo | Object | 响应对象。 |
返回示例
{
"data": {
"findManyRoleInfo": {
"id": "afa7bf6ccc6411edbdf2e0be033383f6",
"code": "role1"
}
}
}
角色权限配置接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
authorizeOneRoleInfo
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
data | RoleInfoAuthorizeInput | 是的 | 授权信息 |
where | RoleInfoWhereUniqueInput | 是的 | 条件信息 |
请求示例
mutation {
authorizeOneRoleInfo (data: RoleInfoAuthorizeInput!, where: RoleInfoWhereUniqueInput!) {
id
code
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— authorizeOneRoleInfo | Object | 响应对象。 |
返回示例
{
"data": {
"authorizeOneRoleInfo": {
"code": "afa7bf6ccc6411edbdf2e0be033383f6"
}
}
}
查询角色资源权限信息
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
permissionOneRoleInfo
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
where | RoleInfoWhereUniqueInput | 是 | 条件信息 |
请求示例
query {
permissionOneRoleInfo (where: RoleInfoWhereUniqueInput!) {
id
code
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— permissionOneRoleInfo | Object | 响应对象。 |
返回示例
{
"data": {
"permissionOneRoleInfo": {
"id": "afa7bf6ccc6411edbdf2e0be033383f6",
"code": "role1"
}
}
}
关联用户接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
updateManyUserRole
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
data | UserRoleUpdateManyMutationInput | 是的 | 用户组关联用户信息 |
where | UserRoleWhereInput | 是的 | 条件 |
请求示例
mutation {
updateManyUserRole (data: UserRoleUpdateManyMutationInput!, where: UserRoleWhereInput) {
count
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— updateManyUserRole | Object | 响应对象。 |
返回示例
{
"data": {
"updateManyUserRole": {
"count": 1
}
}
}
解除关联用户接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
deleteManyUserRole
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
where | UserRoleWhereInput | 是的 | 条件信息 |
请求示例
mutation {
deleteManyUserRole (where: UserRoleWhereInput!) {
count
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— deleteManyUserRole | Object | 响应对象。 |
返回示例
{
"data": {
"deleteManyUserRole": {
"count": 1
}
}
}
查询关联用户接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
findManyUserRole
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
where | UserRoleWhereInput | 否 | 条件信息 |
orderBy | UserRoleOrderByWithRelationInput | 否 | 排序信息 |
cursor | UserRoleWhereUniqueInput | 否 | 指定列表的位置(该值通常指定一个或其他唯一值)。id |
take | Int | 否 | 指定应在列表中返回多少个对象(从列表的开头(正值)或结尾(负值)或位置(如果提到)查看)cursor |
skip | Int | 否 | 跳过 |
distinct | UserRoleScalarFieldEnum | 否 | 去重 |
请求示例
query {
findManyUserRole (where: UserRoleWhereInput, orderBy: UserRoleOrderByWithRelationInput, cursor: UserRoleWhereUniqueInput, take: Int, skip: Int, distinct: UserRoleScalarFieldEnum) {
id
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— findManyUserRole | Object | 响应对象。 |
返回示例
{
"data": {
"findManyUserRole": {
"id": "afa7bf6ccc6411edbdf2e0be033383f6"
}
}
}
应用管理接口
添加应用信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
createOneApplication
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
data | ApplicationCreateInput | 是的 | 用户信息 |
请求示例
mutation {
createOneApplication(data: ApplicationCreateInput!) {
id
applicationCode
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— createOneApplication | Object | 响应对象。 |
返回示例
{
"data": {
"createOneApplication": {
"id": "1747b011cc6411edbdf2e0be033383f6",
"applicationCode": "zhangsan"
}
}
}
编辑应用信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
updateOneApplication
- 请求参数
-请求参数说明
字段 | 类型 | 必填 | 描述 |
---|---|---|---|
data | ApplicationUpdateInput | 是的 | 用户信息 |
where | ApplicationWhereUniqueInput | 是的 | 条件信息 |
- 请求示例
mutation {
updateOneApplication(data: ApplicationUpdateInput!, where: ApplicationWhereUniqueInput) {
id
applicationCode
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— updateOneApplication | Object | 响应对象。 |
返回示例
{
"data": {
"updateOneApplication": {
"id": "46c108dccc6411edbdf2e0be033383f6",
"applicationCode": "zhangsan"
}
}
}
删除应用信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
deleteManyApplication
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
where | ApplicationWhereInput | 是的 | 条件信息 |
请求示例
mutation {
deleteManyApplication(where: ApplicationWhereInput!) {
count
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— deleteManyApplication | Object | 响应对象。 |
返回示例
{
"data": {
"deleteManyApplication": {
"count": 1
}
}
}
查询应用信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
findManyApplication
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
where | ApplicationWhereInput | 否 | 条件信息 |
orderBy | ApplicationOrderByWithRelationInput | 否 | 排序信息 |
cursor | ApplicationWhereUniqueInput | 否 | 指定列表的位置(该值通常指定一个或其他唯一值)。id |
take | Int | 否 | 指定应在列表中返回多少个对象(从列表的开头(正值)或结尾(负值)或位置(如果提到)查看)cursor |
skip | Int | 否 | 跳过 |
distinct | ApplicationScalarFieldEnum | 否 | 去重 |
请求示例
query {
findManyApplication (where: ApplicationWhereInput, orderBy: ApplicationOrderByWithRelationInput, cursor: ApplicationWhereUniqueInput, take: Int, skip: Int, distinct: ApplicationScalarFieldEnum) {
id
applicationCode
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— findManyApplication | Object | 响应对象。 |
返回示例
{
"data": {
"findManyApplication": {
"id": "afa7bf6ccc6411edbdf2e0be033383f6",
"applicationCode": "string"
}
}
}
添加模块信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
createOneModuleInfo
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
data | ModuleInfoCreateInput | 是的 | 用户信息 |
请求示例
mutation {
createOneModuleInfo(data: ModuleInfoCreateInput!) {
id
code
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— createOneModuleInfo | Object | 响应对象。 |
- 返回示例
{
"data": {
"createOneModuleInfo": {
"id": "1747b011cc6411edbdf2e0be033383f6",
"code": "zhangsan"
}
}
}
编辑模块信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
updateOneModuleInfo
- 请求参数
请求参数说明
字段 | 类型 | 必填 | 描述 |
---|---|---|---|
data | ModuleInfoUpdateInput | 是的 | 用户信息 |
where | ModuleInfoWhereUniqueInput | 是的 | 条件信息 |
请求示例
mutation {
updateOneModuleInfo(data: ModuleInfoUpdateInput!, where: ModuleInfoWhereUniqueInput) {
id
code
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— updateOneModuleInfo | Object | 响应对象。 |
返回示例
{
"data": {
"updateOneModuleInfo": {
"id": "46c108dccc6411edbdf2e0be033383f6",
"code": "zhangsan"
}
}
}
删除模块信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
deleteManyModuleInfo
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
where | ModuleInfoWhereInput | 是的 | 条件信息 |
请求示例
mutation {
deleteManyModuleInfo(where: ModuleInfoWhereInput!) {
count
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— deleteManyModuleInfo | Object | 响应对象。 |
返回示例
{
"data": {
"deleteManyModuleInfo": {
"count": 1
}
}
}
查询模块信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
findManyModuleInfo
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
where | ModuleInfoWhereInput | 否 | 条件信息 |
orderBy | ModuleInfoOrderByWithRelationInput | 否 | 排序信息 |
cursor | ModuleInfoWhereUniqueInput | 否 | 指定列表的位置(该值通常指定一个或其他唯一值)。id |
take | Int | 否 | 指定应在列表中返回多少个对象(从列表的开头(正值)或结尾(负值)或位置(如果提到)查看)cursor |
skip | Int | 否 | 跳过 |
distinct | ModuleInfoScalarFieldEnum | 否 | 去重 |
请求示例
query {
findManyModuleInfo (where: ModuleInfoWhereInput, orderBy: ModuleInfoOrderByWithRelationInput, cursor: ModuleInfoWhereUniqueInput, take: Int, skip: Int, distinct: ModuleInfoScalarFieldEnum) {
id
code
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— findManyModuleInfo | Object | 响应对象。 |
返回示例
{
"data": {
"findManyModuleInfo": {
"id": "afa7bf6ccc6411edbdf2e0be033383f6",
"code": "string"
}
}
}
资源管理接口
添加菜单资源信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
createOneRoleInfo
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
data | MenuInfoCreateInput | 是的 | 用户信息 |
请求示例
mutation {
createOneMenuInfo(data: MenuInfoCreateInput!) {
id
code
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— createOneMenuInfo | Object | 响应对象。 |
返回示例
{
"data": {
"createOneMenuInfo": {
"id": "1747b011cc6411edbdf2e0be033383f6",
"code": "menu1"
}
}
}
编辑菜单资源信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
updateOneMenuInfo
- 请求参数
请求参数说明
字段 | 类型 | 必填 | 描述 |
---|---|---|---|
data | MenuInfoUpdateInput | 是的 | 用户信息 |
where | MenuInfoWhereUniqueInput | 是的 | 条件信息 |
请求示例
mutation {
updateOneMenuInfo(data: MenuInfoUpdateInput!, where: MenuInfoWhereUniqueInput) {
id
code
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— updateOneMenuInfo | Object | 响应对象。 |
返回示例
{
"data": {
"updateOneMenuInfo": {
"id": "46c108dccc6411edbdf2e0be033383f6",
"code": "menu1"
}
}
}
删除菜单资源信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
deleteManyMenuInfo
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
where | MenuInfoWhereInput | 是的 | 条件信息 |
请求示例
mutation {
deleteManyMenuInfo(where: MenuInfoWhereInput!) {
count
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— deleteManyMenuInfo | Object | 响应对象。 |
返回示例
{
"data": {
"deleteManyMenuInfo": {
"count": 1
}
}
}
查询菜单资源信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
findManyMenuInfo
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
where | MenuInfoWhereInput | 否 | 条件信息 |
orderBy | MenuInfoOrderByWithRelationInput | 否 | 排序信息 |
cursor | MenuInfoWhereUniqueInput | 否 | 指定列表的位置(该值通常指定一个或其他唯一值)。id |
take | Int | 否 | 指定应在列表中返回多少个对象(从列表的开头(正值)或结尾(负值)或位置(如果提到)查看)cursor |
skip | Int | 否 | 跳过 |
distinct | MenuInfoScalarFieldEnum | 否 | 去重 |
请求示例
query {
findManyMenuInfo (where: MenuInfoWhereInput, orderBy: MenuInfoOrderByWithRelationInput, cursor: MenuInfoWhereUniqueInput, take: Int, skip: Int, distinct: MenuInfoScalarFieldEnum) {
id
code
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— findManyMenuInfo | Object | 响应对象。 |
返回示例
{
"data": {
"findManyMenuInfo": {
"id": "afa7bf6ccc6411edbdf2e0be033383f6",
"code": "menu1"
}
}
}
添加API资源信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
createOneApiInfo
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
data | ApiInfoCreateInput | 是的 | 用户信息 |
请求示例
mutation {
createOneApiInfo(data: ApiInfoCreateInput!) {
id
code
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— createOneApiInfo | Object | 响应对象。 |
返回示例
{
"data": {
"createOneApiInfo": {
"id": "1747b011cc6411edbdf2e0be033383f6",
"code": "api1"
}
}
}
编辑API资源信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
updateOneApiInfo
- 请求参数
请求参数说明
字段 | 类型 | 必填 | 描述 |
---|---|---|---|
data | ApiInfoUpdateInput | 是的 | 用户信息 |
where | ApiInfoWhereUniqueInput | 是的 | 条件信息 |
请求示例
mutation {
updateOneApiInfo(data: ApiInfoUpdateInput!, where: ApiInfoWhereUniqueInput) {
id
code
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— updateOneApiInfo | Object | 响应对象。 |
返回示例
{
"data": {
"updateOneApiInfo": {
"id": "46c108dccc6411edbdf2e0be033383f6",
"code": "api1"
}
}
}
删除API资源信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
deleteManyApiInfo
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
where | ApiInfoWhereInput | 是的 | 条件信息 |
请求示例
mutation {
deleteManyApiInfo(where: ApiInfoWhereInput!) {
count
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— deleteManyApiInfo | Object | 响应对象。 |
返回示例
{
"data": {
"deleteManyApiInfo": {
"count": 1
}
}
}
查询API资源信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
findManyApiInfo
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
where | ApiInfoWhereInput | 否 | 条件信息 |
orderBy | ApiInfoOrderByWithRelationInput | 否 | 排序信息 |
cursor | ApiInfoWhereUniqueInput | 否 | 指定列表的位置(该值通常指定一个或其他唯一值)。id |
take | Int | 否 | 指定应在列表中返回多少个对象(从列表的开头(正值)或结尾(负值)或位置(如果提到)查看)cursor |
skip | Int | 否 | 跳过 |
distinct | ApiInfoScalarFieldEnum | 否 | 去重 |
请求示例
query {
findManyApiInfo (where: ApiInfoWhereInput, orderBy: ApiInfoOrderByWithRelationInput, cursor: ApiInfoWhereUniqueInput, take: Int, skip: Int, distinct: ApiInfoScalarFieldEnum) {
id
code
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— findManyApiInfo | Object | 响应对象。 |
返回示例
{
"data": {
"findManyApiInfo": {
"id": "afa7bf6ccc6411edbdf2e0be033383f6",
"code": "api1"
}
}
}
令牌管理接口
添加令牌信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
createOneTokenInfo
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
data | TokenInfoCreateInput | 是的 | 用户信息 |
请求示例
mutation {
createOneTokenInfo(data: TokenInfoCreateInput!) {
id
code
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— createOneTokenInfo | Object | 响应对象。 |
返回示例
{
"data": {
"createOneTokenInfo": {
"id": "1747b011cc6411edbdf2e0be033383f6",
"code": "token1"
}
}
}
编辑令牌信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
updateOneTokenInfo
- 请求参数
请求参数说明
字段 | 类型 | 必填 | 描述 |
---|---|---|---|
data | TokenInfoUpdateInput | 是的 | 用户信息 |
where | TokenInfoWhereUniqueInput | 是的 | 条件信息 |
请求示例
mutation {
updateOneTokenInfo(data: TokenInfoUpdateInput!, where: TokenInfoWhereUniqueInput) {
id
code
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— updateOneTokenInfo | Object | 响应对象。 |
返回示例
{
"data": {
"updateOneTokenInfo": {
"id": "46c108dccc6411edbdf2e0be033383f6",
"code": "token1"
}
}
}
删除令牌信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
deleteManyTokenInfo
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
where | TokenInfoWhereInput | 是的 | 条件信息 |
请求示例
mutation {
deleteManyTokenInfo(where: TokenInfoWhereInput!) {
count
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— deleteManyTokenInfo | Object | 响应对象。 |
返回示例
{
"data": {
"deleteManyTokenInfo": {
"count": 1
}
}
}
查询令牌信息接口
请求地址、请求方式、请求数据类型参照Graphql
- 请求方法
findManyTokenInfo
- 请求参数
请求参数说明
名字 | 类型 | 必填 | 描述 |
---|---|---|---|
where | TokenInfoWhereInput | 否 | 条件信息 |
orderBy | TokenInfoOrderByWithRelationInput | 否 | 排序信息 |
cursor | TokenInfoWhereUniqueInput | 否 | 指定列表的位置(该值通常指定一个或其他唯一值)。id |
take | Int | 否 | 指定应在列表中返回多少个对象(从列表的开头(正值)或结尾(负值)或位置(如果提到)查看)cursor |
skip | Int | 否 | 跳过 |
distinct | TokenInfoScalarFieldEnum | 否 | 去重 |
请求示例
query {
findManyTokenInfo (where: TokenInfoWhereInput, orderBy: TokenInfoOrderByWithRelationInput, cursor: TokenInfoWhereUniqueInput, take: Int, skip: Int, distinct: TokenInfoScalarFieldEnum) {
id
code
}
}
- 执行结果
返回参数说明
字段 | 类型 | 描述 |
---|---|---|
data | Object | |
|— findManyTokenInfo | Object | 响应对象。 |
返回示例
{
"data": {
"findManyTokenInfo": {
"id": "afa7bf6ccc6411edbdf2e0be033383f6",
"code": "token1"
}
}
}
Restful接口
公共接口响应体定义
(1)参数描述
参数名称 | 参数说明 | 类型 |
---|---|---|
message | 错误信息 | string |
code | 请求状态(0:成功,其他:失败) | integer |
timestamp | 响应时间戳 | Long |
data | 成功数据 | string |
(2)响应格式:
- 成功信息:
{ “data”:<响应数据体>, “code”: 100000, “timestamp”: 1605778520744 } |
---|
- 失败信息:
{ “message”: <错误信息>, “code”: 1010101, “timestamp”: 1605778520744 } |
---|
用户管理接口
添加用户信息接口
- 接口地址: /user
- 请求方式:POST
- 请求数据类型:application/json
- 接口描述:添加用户信息接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
type | 用户类型,1:普通用户,2:人员用户 | body | true | 1 | Integer |
account | 用户名 | body | true | 32 | String |
password | 密码 | body | true | 128 | String |
personnelCode | 人员编码 | body | false | 32 | String |
roleCodes | 角色编码数组 | body | false | - | Array |
validityPeriod | 用户有效期 | body | false | - | String |
rfid | rfid卡 | body | false | 128 | String |
remark | 描述 | body | false | 300 | String |
-
响应数据体: 参照公共响应体
-
请求示例:
{
"type": 1,
"account": "admin123",
"password": "dgjadakjgdafldnagja",
"personnelCode": "",
"roleCodes": [
"fdasfdsa",
"gdafsdaf"
],
"validityPeriod": "2023-03-07 10:18:22",
"rfid": "dfasgda",
"remark": ""
}
- 响应示例: 参照公共响应体
更新用户信息接口
- 接口地址: /user
- 请求方式:PUT
- 请求数据类型:application/json
- 接口描述:修改用户信息接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
account | 用户名 | body | true | 32 | String |
roleCodes | 角色编码数组 | body | false | - | Array |
validityPeriod | 用户有效期 | body | false | - | String |
rfid | rfid卡 | body | false | 128 | String |
remark | 描述 | body | false | 300 | String |
-
响应数据体: 参照公共响应体
-
请求示例:
{
"account": "admin123",
"roleCodes": [
"fdasfdsa",
"gdafsdaf"
],
"validityPeriod": "2023-03-07 10:18:22",
"rfid": "dfasgda",
"remark": ""
}
- 响应示例: 参照公共响应体
删除用户接口
- 接口地址: /user
- 请求方式:DELETE
- 请求数据类型:application/json
- 接口描述:锁定用户接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
accounts | 用户名组 | body | true | 32 | Array |
-
响应数据体: 参照公共响应体
-
请求示例:
{
"accounts": [
"admin123",
"admin456"
]
}
- 响应示例: 参照公共响应体
获取用户列表接口
- 接口地址: /user
- 请求方式:GET
- 请求数据类型:application/json
- 接口描述:获取用户列表接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
keyword | 关键字 | query | false | - | String |
pageNum | 当前页数 | query | false | - | Integer |
pageSize | 每页显示条数 | query | false | - | Integer |
type | 用户类型,1:普通用户,2:人员用户 | query | false | - | String |
state | 用户状态,1:正常,2:锁定 | query | false | - | String |
- 响应数据体(**JSON**对象):
参数名称 | 参数说明 | 类型 |
---|---|---|
data | 数据结果列表 | Object[] |
|— account | 用户名 | String |
|— name | 姓名 | String |
|— type | 用户类型,1:普通用户,2:人员用户 | Integer |
|— phoneNumber | 手机号 | String |
邮箱 | String | |
|— state | 用户状态,1:正常,2:锁定 | Integer |
|— createdAt | 创建时间 | String |
|— personnelCode | 人员编码 | String |
|— roleCodes | 角色编码数组 | Array |
|— validityPeriod | 用户有效期 | String |
|— rfid | rfid卡 | String |
|— remark | 描述 | String |
total | 总条数 | Long |
pageNum | 当前页数 | Integer |
pageSize | 每页显示条数 | Integer |
message | 响应信息 | String |
code | 响应状态(0:成功,其他:失败) | Integer |
timestamp | 响应时间戳 | Long |
- 请求示例:
/user/list?pageNum=1&pageSize=10&state=&type=&keyword=
- 响应示例:
响应示例
{
"data": [
{
"type": 1,
"account": "admin123",
"name": "admin123",
"phoneNumber": "",
"email": "",
"state": 1,
"createdAt": "2023-3-7 11:12:42",
"personnelCode": "",
"roleCodes": [
"fdasfdsa",
"gdafsdaf"
],
"validityPeriod": "2023-03-07 10:18:22",
"rfid": "dfasgda",
"remark": ""
}
],
"total": 100,
"pageNum": 1,
"pageSize": 10,
"message": "",
"code": 0,
"timestamp": 1678158628933
}
用户组管理接口
添加用户组接口
- 接口地址: /userGroup
- 请求方式:POST
- 请求数据类型:application/json
- 接口描述:添加用户组接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
code | 编码 | body | true | 32 | String |
name | 名称 | body | true | 64 | String |
parentCode | 父编号 | body | false | 32 | String |
remark | 描述 | body | false | 300 | String |
-
响应数据体: 参照公共响应体
-
请求示例:
{
"code": "admin123",
"name": "dgjadakjgdafldnagja",
"parentCode": "",
"remark": ""
}
- 响应示例: 参照公共响应体
编辑用户组接口
- 接口地址: /userGroup
- 请求方式:PUT
- 请求数据类型:application/json
- 接口描述:编辑用户组接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
code | 编码 | body | true | 32 | String |
name | 名称 | body | true | 64 | String |
parentCode | 父编号 | body | false | 32 | String |
remark | 描述 | body | false | 300 | String |
-
响应数据体: 参照公共响应体
-
请求示例:
{
"code": "admin123",
"name": "dgjadakjgdafldnagja",
"parentCode": "",
"remark": ""
}
- 响应示例: 参照公共响应体
删除用户组接口
- 接口地址: /userGroup
- 请求方式:DELETE
- 请求数据类型:application/json
- 接口描述:删除用户组接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
codes | 编码数组 | body | true | - | String |
-
响应数据体: 参照公共响应体
-
请求示例:
{
"codes": [
"group1",
"group2"
]
}
- 响应示例: 参照公共响应体
获取用户组信息接口
- 接口地址: /userGroup
- 请求方式:GET
- 请求数据类型:application/json
- 接口描述:获取用户组信息接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
keyword | 关键字 | query | false | - | String |
- 响应数据体(**JSON**对象):
参数名称 | 参数说明 | 类型 |
---|---|---|
data | 数据结果列表 | Object[] |
|— code | 编码 | String |
|— name | 名称 | String |
|— remark | 描述 | String |
|— children | 子列表 | Object[] |
|— |— code | 编码 | String |
|— |— name | 名称 | String |
|— |— remark | 描述 | String |
message | 响应信息 | String |
code | 响应状态(0:成功,其他:失败) | Integer |
timestamp | 响应时间戳 | Long |
- 请求示例:
/userGroup/list?keyword=
- 响应示例:
响应示例
{
"data": [
{
"code": "admin123",
"name": "admin123",
"children": [
{
"code": "admin123",
"name": "admin123",
"remark": "",
"children": []
}
],
"remark": ""
}
],
"message": "",
"code": 0,
"timestamp": 1678158628933
}
关联用户接口
- 接口地址: /userGroup/bindUser
- 请求方式:POST
- 请求数据类型:application/json
- 接口描述:关联用户接口,全量更新关联用户
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
code | 用户组编码 | body | true | 32 | String |
accounts | 用户账号数组 | body | true | - | Array |
-
响应数据体: 参照公共响应体
-
请求示例:
{
"code": "admin123",
"accounts": [
"dgjadakjgdafldnagja"
]
}
- 响应示例: 参照公共响应体
解除关联用户接口
- 接口地址: /userGroup/unbindUser
- 请求方式:PUT
- 请求数据类型:application/json
- 接口描述:解除关联用户接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
code | 用户组编码 | body | true | 32 | String |
accounts | 用户账号数组 | body | true | - | Array |
-
响应数据体: 参照公共响应体
-
请求示例:
{
"code": "admin123",
"accounts": [
"dgjadakjgdafldnagja"
]
}
- 响应示例: 参照公共响应体
查询关联用户接口
- 接口地址: /userGroup/userList
- 请求方式:GET
- 请求数据类型:application/json
- 接口描述:获取用户组信息接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
code | 用户组编码 | query | true | 32 | String |
keyword | 关键字 | query | false | - | String |
- 响应数据体(**JSON**对象):
参数名称 | 参数说明 | 类型 |
---|---|---|
data | 数据结果列表 | Object[] |
|— account | 用户名 | String |
|— name | 姓名 | String |
message | 响应信息 | String |
code | 响应状态(0:成功,其他:失败) | Integer |
timestamp | 响应时间戳 | Long |
- 请求示例:
/userGroup/userList?code=fdafdas&keyword=
- 响应示例:
{
"data": [
{
"account": "admin123",
"name": "admin123"
}
],
"message": "",
"code": 0,
"timestamp": 1678158628933
}
角色管理接口
添加角色接口
- 接口地址: /role
- 请求方式:POST
- 请求数据类型:application/json
- 接口描述:添加角色接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
code | 编码 | body | true | 32 | String |
name | 名称 | body | true | 64 | String |
remark | 描述 | body | false | 300 | String |
-
响应数据体: 参照公共响应体
-
请求示例:
{
"code": "admin123",
"name": "dgjadakjgdafldnagja",
"remark": ""
}
- 响应示例: 参照公共响应体
更新角色接口
- 接口地址: /role
- 请求方式:PUT
- 请求数据类型:application/json
- 接口描述:更新角色接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
code | 编码 | body | true | 32 | String |
name | 名称 | body | true | 64 | String |
remark | 描述 | body | false | 300 | String |
-
响应数据体: 参照公共响应体
-
请求示例:
{
"code": "admin123",
"name": "dgjadakjgdafldnagja",
"remark": ""
}
- 响应示例: 参照公共响应体
删除角色接口
- 接口地址: /role
- 请求方式:DELETE
- 请求数据类型:application/json
- 接口描述:删除角色接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
codes | 编码数组 | body | true | 32 | String |
-
响应数据体: 参照公共响应体
-
请求示例:
{
"codes": [
"admin123"
]
}
- 响应示例: 参照公共响应体
获取角色信息接口
- 接口地址: /role
- 请求方式:GET
- 请求数据类型:application/json
- 接口描述:获取用户列表接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
keyword | 关键字 | query | false | - | String |
pageNum | 当前页数 | query | false | - | Integer |
pageSize | 每页显示条数 | query | false | - | Integer |
- 响应数据体(**JSON**对象):
参数名称 | 参数说明 | 类型 |
---|---|---|
data | 数据结果列表 | Object[] |
|— code | 编码 | String |
|— name | 姓名 | String |
|— createdAt | 创建时间 | String |
|— remark | 描述 | String |
total | 总条数 | Long |
pageNum | 当前页数 | Integer |
pageSize | 每页显示条数 | Integer |
message | 响应信息 | String |
code | 响应状态(0:成功,其他:失败) | Integer |
timestamp | 响应时间戳 | Long |
- 请求示例:
/role/list?pageNum=1&pageSize=10&keyword=
- 响应示例:
响应示例
{
"data": [
{
"code": "admin123",
"name": "admin123",
"createdAt": "2023-03-07 14:33:56",
"remark": ""
}
],
"total": 100,
"pageNum": 1,
"pageSize": 10,
"message": "",
"code": 0,
"timestamp": 1678158628933
}
关联用户接口
- 接口地址: /role/bindUser
- 请求方式:POST
- 请求数据类型:application/json
- 接口描述:关联用户接口,全量更新关联用户
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
code | 角色编码 | body | true | 32 | String |
accounts | 用户账号数组 | body | true | - | Array |
-
响应数据体: 参照公共响应体
-
请求示例:
{
"code": "admin123",
"accounts": [
"dgjadakjgdafldnagja"
]
}
- 响应示例: 参照公共响应体
解除关联用户接口
- 接口地址: /role/unbindUser
- 请求方式:PUT
- 请求数据类型:application/json
- 接口描述:解除关联用户接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
code | 角色编码 | body | true | 32 | String |
accounts | 用户账号数组 | body | true | - | Array |
-
响应数据体: 参照公共响应体
-
请求示例:
{
"code": "admin123",
"accounts": [
"dgjadakjgdafldnagja"
]
}
- 响应示例: 参照公共响应体
查询关联用户接口
- 接口地址: /role/userList
- 请求方式:GET
- 请求数据类型:application/json
- 接口描述:获取用户组信息接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
code | 角色编码 | query | true | 32 | String |
keyword | 关键字 | query | false | - | String |
- 响应数据体(**JSON**对象):
参数名称 | 参数说明 | 类型 |
---|---|---|
data | 数据结果列表 | Object[] |
|— account | 用户名 | String |
|— name | 姓名 | String |
message | 响应信息 | String |
code | 响应状态(0:成功,其他:失败) | Integer |
timestamp | 响应时间戳 | Long |
- 请求示例:
/role/userList?code=fdafdas&keyword=
- 响应示例:
{
"data": [
{
"account": "admin123",
"name": "admin123"
}
],
"message": "",
"code": 0,
"timestamp": 1678158628933
}
应用管理接口
添加应用接口
-
接口地址: /application
-
请求方式:POST
-
请求数据类型:application/json
-
接口描述:添加应用管理接口
-
请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
applicationCode | 应用编码 | body | true | 32 | String |
applicationName | 应用名称 | body | false | 64 | String |
applicationType | 应用类别(1:WEB应用,2:API应用,3:移动应用) | body | false | - | int |
isOtherApplication | 是否第三方应用(0:不是 1:是) | body | false | - | int |
visitUrl | 访问地址 | body | false | 255 | String |
imageUrl | 图标地址 | body | false | 255 | String |
authType | 权限类型(1:菜单/按钮,2:API资源,3:数据资源) | body | false | - | int |
remark | 描述 | body | false | 255 | string |
clientId | 客户端Id | body | true | 32 | string |
clientSecret | 客户端secret | body | true | 255 | string |
callBackUrl | 回调地址 | body | true | 255 | string |
accessTokenOverUnit | accessToken过期时间单位(0:小时,1:天) | body | true | - | int |
accessTokenOverValue | accessToken过期时间值 | body | true | 32 | string |
refreshTokenOverUnit | refreshToken过期时间单位(0:小时,1:天) | body | true | - | int |
refreshTokenOverValue | refreshToken过期时间值 | body | true | 32 | string |
-
响应数据体: 参照公共响应体
-
请求示例:
请求示例
{
"applicationCode":"BOM6",
"applicationName":"BOM6",
"applicationType":1,
"isOtherApplication":0,
"visitUrl":"http://www.test.com/MES",
"imageUrl":"XXXXXXX",
"authType":1,
"remark":"说明简介",
"clientId":"app1",
"clientSecret":"\*\*\*\*\*\*\*\*\*\*",
"callbackUrl":"http://www.test.com/MES",
"accessTokenOverUnit":1,
"accessTokenOverValue":"2",
"refreshTokenOverUnit":1,
"refreshTokenOverValue":3
}
- 响应示例: 参照公共响应体
编辑应用接口
- 接口地址: /application
- 请求方式: PUT
- 请求数据类型:application/json
- 接口描述:修改应用管理接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
applicationCode | 应用编码 | body | true | 32 | String |
applicationName | 应用名称 | body | false | 64 | String |
applicationType | 应用类别 | body | false | - | int |
isOtherApplication | 是否第三方应用 | body | false | - | int |
visitUrl | 访问地址 | body | false | 255 | String |
imageUrl | 图标地址 | body | false | 255 | String |
authType | 权限类型 | body | false | - | int |
remark | 描述 | body | false | 255 | string |
clientId | 客户端Id | body | true | 32 | string |
clientSecret | 客户端secret | body | true | 255 | string |
callBackUrl | 回调地址 | body | true | 255 | string |
accessTokenOverUnit | accessToken过期时间单位 | body | true | - | int |
accessTokenOverValue | accessToken过期时间值 | body | true | 32 | string |
refreshTokenOverUnit | refreshToken过期时间单位 | body | true | - | int |
refreshTokenOverValue | refreshToken过期时间值 | body | true | 32 | string |
-
响应数据体: 参照公共响应体
-
请求示例:
请求示例
{
"applicationCode": "BOM55",
"applicationName": "BOM56",
"applicationType": 1,
"isOtherApllication": null,
"visitUrl": "http://www.test.com/MES35",
"imageUrl": "XXXXXXX4",
"authType": 1,
"remark": "说明简介4",
"clientId": "app14",
"clientSecret": "********",
"callbackUrl": "http://www.test.com/MES4",
"accessTokenOverUnit": 1,
"accessTokenOverValue": "2",
"refreshTokenOverUnit": 1,
"refreshTokenOverValue": "3"
}
- 响应示例: 参照公共响应体
删除应用接口
- 接口地址: /application
- 请求方式:DELETE
- 请求数据类型:application/json
- 接口描述:删除应用管理接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
applicationCodeList | 应用code组 | body | true | 32 | Array |
-
响应数据体: 参照公共响应体
-
请求示例:
{
"applicationCodeList": [
"sss"
]
}
- 响应示例: 参照公共响应体
获取应用信息接口
- 接口地址:/application
- 请求方式:GET
- 请求数据类型:application/json
- 接口描述:获取应用信息接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
applicationName | 应用名称 | query | false | - | String |
pageNum | 当前页数 | query | true | - | Integer |
pageSize | 每页显示条数 | query | true | - | Integer |
- 响应数据体(JSON对象):
参数名称 | 参数说明 | 类型 |
---|---|---|
data | 数据结果列表 | Object[] |
|— applicationCode | 应用编码 | String |
|— applicationName | 应用名称 | String |
|— applicationType | 应用类别 | int |
|— isOtherApplication | 是否第三方应用 | int |
|— visitUrl | 访问地址 | String |
|— imageUrl | 图标地址 | String |
|— authType | 权限类型 | int |
|— remark | 描述 | String |
|— clientId | 客户端Id | String |
|— clientSecret | 客户端secret | String |
|— callbackUrl | 回调地址 | String |
|— accessTokenOverUnit | accessToken过期时间单位 | int |
|— accessTokenOverValue | accessToken过期时间值 | string |
|— refreshTokenOverUnit | refreshToken过期时间单位 | int |
|— refreshTokenOverValue | refreshToken过期时间值 | string |
|— createBy | 创建人 | string |
|— createdAt | 创建时间 | Date |
|— updatedBy | 修改人 | string |
|— updatedAt | 修改时间 | Date |
message | 响应信息 | String |
pageNum | 页码 | Integer |
pageSize | 页大小 | Integer |
code | 返回状态 | Integer |
timestamp | 响应时间戳 | Long |
total | 总数 | Integer |
- 请求示例:
/application?pageNum=1&pageSize=10&applicationName=
- 响应示例:
响应示例
{
"data": [
{
"applicationCode": "BOM55",
"applicationName": "BOM56",
"applicationType": 1,
"isOtherApplication": null,
"visitUrl": "http://www.test.com/MES35",
"imageUrl": "XXXXXXX4",
"authType": 1,
"remark": "说明简介4",
"clientId": "app14",
"clientSecret": "\*\*\*\*\*\*\*\*\*\*",
"callbackUrl": "http://www.test.com/MES4",
"accessTokenOverUnit": 1,
"accessTokenOverValue": "2",
"refreshTokenOverUnit": 1,
"refreshTokenOverValue": "3",
"createBy": null,
"createdAt": "2022-09-06 10:16:34",
"updatedBy": "1234",
"updatedAt": "2022-09-06 10:19:35"
}
],
"message": "查询成功",
"pageNum": 1,
"pageSize": 10,
“code”: 0,
"timestamp": 1678755765281,
"total": 1
}
}
添加模块接口
- 接口地址: /m**oduleInfo**
- 请求方式:POST
- 请求数据类型:application/json
- 接口描述:添加模块配置接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | int |
applicationId | 应用code | body | true | 32 | string |
parentId | 父模块id | body | true | - | int |
code | 模块编码 | body | true | 255 | string |
name | 模块名称 | body | true | 255 | string |
-
响应数据体: 参照公共响应体
-
请求示例:
{
"applicationId":"BOM6",
"parentId":1,
"code":"module1",
"name":"模块1"
}
- 响应示例: 参照公共响应体
编辑模块接口
- 接口地址: /**m**oduleInfo
- 请求方式: PUT
- 请求数据类型:application/json
- 接口描述:修改模块配置接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | int |
moduleId | 模块id | body | true | - | int |
applicationId | 应用Code | body | true | 32 | string |
parentId | 父模块id | body | true | - | int |
code | 模块编码 | body | true | 255 | string |
name | 模块名称 | body | true | 255 | string |
-
响应数据体: 参照公共响应体
-
请求示例:
{
"moduleId":1,
"applicationCode":"app1",
"parentId":1,
"code":"code",
"name":"子模块一"
}
- 响应示例: 参照公共响应体
删除模块接口
- 接口地址: / m**oduleInfo**
- 请求方式:DELETE
- 请求数据类型:application/json
- 接口描述:删除模块配置接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
moduleIdList | 模块ID组 | body | true | 32 | Array |
-
**响应数据体:**参照公共响应体
-
请求示例:
{
"moduleIdList": [
"sss"
]
}
- 响应示例: 参照公共响应体
获取模块信息接口
- 接口地址:/**m**oduleInfo
- 请求方式:GET
- 请求数据类型:application/json
- 接口描述:获取模块信息接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
name | 模块名称 | query | false | - | String |
applicationId | 应用Code | query | true | String | |
pageNum | 当前页数 | query | true | - | Integer |
pageSize | 每页显示条数 | query | true | - | Integer |
- 响应数据体(JSON对象):
参数名称 | 参数说明 | 类型 |
---|---|---|
data | 数据结果列表 | Object[] |
|— applicationId | 应用Code | String |
|— applicationName | 应用名称 | String |
|— parentId | 父模块id | int |
|— parentName | 父模块名称 | String |
|— code | 模块编码 | String |
|— name | 模块名称 | String |
|— children | 子模块集合 | Object[] |
message | 响应信息 | String |
pageNum | 页码 | Integer |
pageSize | 页大小 | Integer |
code | 返回状态 | Integer |
timestamp | 响应时间戳 | Long |
total | 总数 | Integer |
- 请求示例:
/moduleInfo?pageNum=1&pageSize=10&applicationId=1&name=app
- 响应示例:
响应示例
{
"data":[{
"moduleId":1,
"applicationId":"app1",
"applicationName":"BOM",
"parentId":null,
"parentName":"模块一",
"name":"子模块一",
"code":"code11",
"children":[
{
"moduleId":2,
"applicationCode":"app1",
"applicationName":"BOM",
"parentId":1,
"parentName":"子模块一",
"name":"子子模块一",
"code":"code12",
"sonModule":null
},{
"moduleId":3,
"applicationId":"app1",
"applicationName":"BOM",
"parentId":1,
"parentName":"子模块一",
"name":"子子模块二",
"code":"code13",
"sonModule":[{
"moduleId":4,
"applicationCode":"app1",
"applicationName":"BOM",
"parentId":3,
"parentName":"子子模块二",
"name":"子子子模块一",
"code":"code131",
"sonModule":null
}]
}]
}],
"message": "查询成功",
"pageNum": 1,
"pageSize": 10,
“code”: 0,
"timestamp": 1678755765281,
"total": 1
}
资源管理接口
添加菜单接口
- 接口地址: /**menuR**esource
- 请求方式:POST
- 请求数据类型:application/json
- 接口描述:添加菜单资源接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | int |
status | 菜单状态(0:关闭 1:打开) | body | true | - | int |
moduleId | 模块id | body | true | 64 | string |
applicationId | 应用编码 | body | true | 32 | string |
parentId | 父菜单id | body | false | 64 | string |
code | 菜单编码 | body | true | 255 | string |
name | 菜单名称 | body | true | 32 | string |
menuType | 菜单类型 | body | true | - | int |
icon | icon | body | false | 255 | string |
url | url | body | false | 255 | string |
openStyle | 打开方式(1:内容区 2:新窗口) | body | false | - | int |
addInfo | 额外信息 | body | false | 255 | string |
-
响应数据体: 参照公共响应体
-
请求示例:
{
"status":1,
"moduleId": "",
"applicationId": "",
"parentId":3,
"code":"code",
"name":"菜单test",
"menuType":1,
"icon":"add,query,
"url":"",
"openStyle":1,
"addInfo":"额外信息"
}
- 响应示例: 参照公共响应体
编辑菜单接口
- 接口地址: /**menuR**esource
- 请求方式: PUT
- 请求数据类型:application/json
- 接口描述:编辑菜单资源接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | int |
id | id | body | true | - | int |
status | 菜单状态(0:关闭 1:打开) | body | true | - | int |
moduleId | 模块id | body | true | 64 | string |
applicationId | 应用编码 | body | true | 32 | string |
parentId | 父菜单id | body | false | 64 | string |
parentName | 父菜单名称 | body | false | 255 | string |
code | 菜单编码 | body | true | 255 | string |
name | 菜单名称 | body | true | 32 | string |
menuType | 菜单类型 | body | true | - | int |
icon | icon | body | false | 255 | string |
url | url | body | false | 255 | string |
openStyle | 打开方式(1:内容区 2:新窗口) | body | false | - | int |
addInfo | 额外信息 | body | false | 255 | string |
-
响应数据体: 参照公共响应体
-
请求示例:
{
"id":1,
"status":1,
"moduleId":1,
"applicationId":"app1",
"parentId":3,
"parentName":"父菜单",
"code":"code",
"name":"菜单test",
"menuType":1,
"icon":"add,query,
"url":"",
"openStyle":1,
"addInfo":"额外信息"
}
- 响应示例: 参照公共响应体
删除菜单接口
- 接口地址: /**menuR**esource
- 请求方式:DELETE
- 请求数据类型:application/json
- 接口描述:删除菜单接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
menuIds | 菜单ID组 | body | true | 32 | Array |
-
响应数据体: 参照公共响应体
-
请求示例:
{
"menuIds": [
"sss"
]
}
响应示例: 参照公共响应体
获取菜单信息接口
- 接口地址:/**menuR**esource
- 请求方式:GET
- 请求数据类型:application/json
- 接口描述:获取菜单信息接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
name | 菜单名称 | query | false | - | String |
applicationId | 应用编码 | query | true | - | String |
- 响应数据体(JSON对象):
参数名称 | 参数说明 | 类型 |
---|---|---|
data | 数据结果列表 | Object[] |
|— id | id | int |
|— status | 菜单状态(0:关闭 1:打开) | int |
|— moduleId | 模块id | int |
|— applicationId | 应用编码 | String |
|— parentId | 父菜单id | int |
|— parentName | 父菜单名称 | String |
|— code | 菜单编码 | String |
|— name | 菜单名称 | String |
|— menuType | 菜单类型 | int |
|— icon | icon | String |
|— url | url | String |
|— openStyle | 打开方式(1:内容区 2:新窗口) | int |
|— addInfo | 额外信息 | String |
|— createBy | 创建人 | string |
|— createdAt | 创建时间 | Date |
|— updatedBy | 修改人 | string |
|— updatedAt | 修改时间 | Date |
message | 响应信息 | String |
pageNum | 页码 | Integer |
pageSize | 页大小 | Integer |
code | 返回状态 | Integer |
timestamp | 响应时间戳 | Long |
total | 总数 | Integer |
- 请求示例:
/menuResource?pageNum=1&pageSize=10&applicationId=app1&name=app
- 响应示例:
响应示例
{
"data":[{
"id":1,
"status":1,
"moduleId":1,
"applicationId":2,
"parentId":3,
"parentName":"父菜单",
"code":"code",
"name":"菜单test",
"menuType":1,
"icon":"add,query,
"url":"",
"openStyle":1,
"addInfo":"额外信息",
"createBy":1,
"createdAt":"2022-09-08 13:19:14",
"updatedBy": "1234",
"updatedAt": "2022-09-06 10:19:35"
}],
"message": "查询成功",
"pageNum": 1,
"pageSize": 10,
"code": 0,
"timestamp": 1678755765281,
"total": 1
}
添加API接口
- 接口地址: /**apiR**esource
- 请求方式:POST
- 请求数据类型:application/json
- 接口描述:添加API资源接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | int |
code | api编码 | body | true | 32 | string |
name | api名称 | body | true | 64 | string |
moduleId | 所属模块 | body | true | - | string |
apiType | 类型(1:Restful 2: Graphql) | body | true | - | int |
apiUrl | url | body | true | 255 | string |
remark | 描述 | body | false | 255 | string |
-
响应数据体: 参照公共响应体
-
请求示例:
{
"code":"userAdd",
"name":"用户添加",
"moduleId":1,
"apiType":2,
"apiUrl":"/api/test/add",
"remark":"描述"
}
响应示例: 参照公共响应体
编辑API接口
- 接口地址: /**apiR**esource
- 请求方式: PUT
- 请求数据类型:application/json
- 接口描述:修改API资源接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | int |
apiId | id | body | true | - | int |
code | api编码 | body | true | 32 | string |
name | api名称 | body | true | 64 | string |
moduleId | 所属模块 | body | true | - | int |
apiType | 类型(1:Restful 2: Graphql) | body | true | - | int |
apiUrl | url | body | true | 255 | string |
remark | 描述 | body | false | 255 | string |
-
响应数据体: 参照公共响应体
-
请求示例:
{
"apiId":1,
"code":"userAdd",
"name":"用户添加",
"moduleId":1,
"apiType":2,
"apiUrl":"/api/test/add",
"remark":"描述"
}
响应示例: 参照公共响应体
删除API接口
- 接口地址: /**apiR**esource
- 请求方式:DELETE
- 请求数据类型:application/json
- 接口描述:删除API接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
apiIds | Api ID组 | body | true | 32 | Array |
-
响应数据体: 参照公共响应体
-
请求示例:
{
"apiIds": [
"sss"
]
}
响应示例: 参照公共响应体
获取API信息接口
- 接口地址:/**apiR**esource
- 请求方式:GET
- 请求数据类型:application/json
- 接口描述:获取API信息接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
name | api名称 | query | false | - | String |
moduleId | 模块id | query | false | - | Integer |
page | 当前页数 | query | true | - | Integer |
pageSize | 每页显示条数 | query | true | - | Integer |
- 响应数据体(JSON对象):
参数名称 | 参数说明 | 类型 |
---|---|---|
data | 数据结果列表 | Object[] |
|— apiId | id | int |
|— code | api编码 | String |
|— name | api名称 | String |
|— moduleId | 模块id | int |
|— name | 模块名称 | String |
|— apiType | 类型 | String |
|— apiUrl | url | String |
|— remark | 描述 | String |
|— createBy | 创建人 | string |
|— createdAt | 创建时间 | Date |
|— updatedBy | 修改人 | string |
|— updatedAt | 修改时间 | Date |
message | 响应信息 | String |
pageNum | 页码 | Integer |
pageSize | 页大小 | Integer |
code | 返回状态 | Integer |
timestamp | 响应时间戳 | Long |
total | 总数 | Integer |
- 请求示例:
/apiResource?pageNum=1&pageSize=10&moduleId=1&name=添加用户
- 响应示例:
响应示例
{
"data":[{
"apiId":1,
"code":"userAdd",
"name":"用户添加",
"moduleId":1,
"apiType":2,
"apiUrl":"/api/test/add",
"remark":"描述",
"createBy":1,
"createdAt":"2022-09-08 13:19:14",
"updatedBy": "1234",
"updatedAt": "2022-09-06 10:19:35"
}],
"message": "查询成功",
"pageNum": 1,
"pageSize": 10,
"code": 0,
"timestamp": 1678755765281,
"total": 1
}
令牌管理接口
添加令牌接口
- 接口地址: /token
- 请求方式:POST
- 请求数据类型:application/json
- 接口描述:添加令牌接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
code | 编码 | body | true | 32 | String |
name | 名称 | body | true | 64 | String |
account | 用户名 | body | true | 32 | String |
overUnit | 有效期单位 | body | true | 3 | String |
overValue | 有效期值 | body | true | - | Integer |
-
响应数据体: 参照公共响应体
-
请求示例:
{
"code": "admin123",
"name": "dgjadakjgdafldnagja",
"account": "admin123",
"overUnit": "h",
"overValue": 2
}
- 响应示例: 参照公共响应体
更新令牌接口
- 接口地址: /token
- 请求方式:PUT
- 请求数据类型:application/json
- 接口描述:更新令牌接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
code | 编码 | body | true | 32 | String |
name | 名称 | body | true | 64 | String |
overUnit | 有效期单位 | body | true | 3 | String |
overValue | 有效期值 | body | true | - | Integer |
-
响应数据体: 参照公共响应体
-
请求示例:
{
"code": "admin123",
"name": "dgjadakjgdafldnagja",
"overUnit": "h",
"overValue": 2
}
- 响应示例: 参照公共响应体
删除令牌接口
- 接口地址: /token
- 请求方式:DELETE
- 请求数据类型: application/json
- 接口描述: 删除令牌接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
codes | 编码 | body | true | - | Array |
-
响应数据体: 参照公共响应体
-
请求示例:
{
"codes": [
"admin123"
]
}
- 响应示例: 参照公共响应体
查询令牌接口
- 接口地址: /token
- 请求方式: GET
- 请求数据类型: application/json
- 接口描述: 查询令牌接口
- 请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据长度 | 数据类型 |
---|---|---|---|---|---|
Authorization | 鉴权token | header/query | true | - | String |
keyword | 关键字 | query | false | - | String |
pageNum | 当前页 | query | false | - | Integer |
pageSize | 每页显示条数 | query | false | - | Integer |
- 响应数据体(JSON对象):
参数名称 | 参数说明 | 类型 |
---|---|---|
data | 数据结果列表 | Object[] |
|— code | 用户名 | String |
|— name | 姓名 | String |
|— account | 用户名 | String |
|— userName | 用户姓名 | String |
|— overUnit | 有效期单位 | String |
|— overValue | 有效期值 | String |
|— token | 令牌 | String |
|— createdAt | 创建时间 | String |
total | 总条数 | Long |
pageNum | 当前页 | Integer |
pageSize | 每页展示条数 | Integer |
message | 响应信息 | String |
code | 响应状态(0:成功,其他:失败) | Integer |
timestamp | 响应时间戳 | Long |
- 请求示例:
/token/list?keyword=&pageNum=1&pageSize=10
-
响应示例:
响应示例
{ "data": [ { "code": "admin123", "name": "admin123", "account": "admin123", "userName": "admin123", "overUnit": "h", "overValue": "2", "token": "gdadagdsagdsafsdagdaf", "createdAt": "2023-03-07 15:09:17" } ], "total": 100, "pageNum": 1, "pageSize": 10, "message": "", "code": 0, "timestamp": 1678158628933 }
案例
- 接入案例
环境 功能 | 运维环境 | 开发环境 | 工程配置环境 | 生产运行环境 | ||
---|---|---|---|---|---|---|
安装环境 | 应用仓库 | 运维环境 | ||||
登录认证 | √ | √ | √ | √ | √ | √ |
权限模型 | × | RBAC | RBAC | RBAC | RBAC | RBAC |
前端接入方式 | 页面集成 | 页面集成 | 页面集成 | 页面集成接入 | Portal接入 | Portal接入 |
后端接入方式 | 直接接入 | 直接接入 | 直接接入 | 直接接入 | 中间件接入 | 中间件接入 |
权限控制案例
菜单/按钮权限
- 通过应用产品门户(例:Portal)维护SCADA应用的菜单/按钮等信息
- 授权A角色SCADA应用的菜单/按钮权限
- 赋予A用户A角色
- 登录A用户
产品门户(例:Portal)查询并展示登录用户所拥有的菜单/按钮信息
API权限
- 实时服务通过中间件代理服务接入网关
- 实时服务配置受控接口信息
- 代理服务自动将受控接口注册到权限服务
- 仅授权A角色查询实时值接口权限
- 赋予A用户A角色
- A用户登录系统并访问查询实时值接口,允许访问,访问写值等其他接口,均提示无权访问
数据权限
- 通过应用产品门户(例:Portal)配置数据组并授权给A角色
- 报表服务提供数据组与报表数据的关联配置
- 赋予A用户A角色
- 登录A角色查询报表
- 报表服务调用中间件/权限服务查询当前用户拥有的数据组权限,并依据数据组权限查询数据组关联的报表数据,最后将数据返回给界面
附件
- OAuth2.0的官方说明详见该网站:https://oauth.net/2/