背景
客户对安全提出了更高的要求,不允许WebRest接口中的Delete操作存在。需要整改WebRest接口中的DELETE操作,将其修改为POST接口。并保证不同版本的兼容性
整体方案
整改WebRest接口中的Delete操作,将其修改为POST接口,并删除原有的Delete接口。前端调用新增的POST接口确保功能正常。
兼容性分析:删除Delete操作类型的uri后,会同步新增POST类型接口实现相应功能。WebRest接口由前端调用,均位于openUBMC,并不涉及openUBMC和BMC SDK的兼容性影响。
后续web的uri接口变更:
(1)新增URI需要从资源维度去描述(参考Redfish),针对资源的描述,不能存在带动作的词汇。
将创建操作视为标准的行为(a);其他操作视为针对该资源的自定义行为(b),需要参考Redfish规范的Action来设计,如:
a. 创建用户:POST:/UI/Rest/AccessMgnt/Accounts
b. 删除用户:POST:/UI/Rest/AccessMgnt/Accounts/Actions/Account.Delete
c. 导入用户公钥:POST:/UI/Rest/AccessMgnt/Accounts/Actions/Account.ImportSSHPublicKey
PS: 行为的请求参数中,需要考虑对多实例和单实例的删除
(2)历史存量URI:
需要补充删除、自定义行为的,按照规则(1)对新增接口进行规范设计,已有接口不再调整
举例:
- 老接口的资源描述不规范,携带动作的。补充删除或者其他自定义行为时,直接使用新的标准资源接口。
- 老接口的资源描述符合规范(1),不携带动作的。直接在相关URI上补充Action
本次整改webrest的delete接口的变更点:
| 业务 | ACTION | 原始URI | 整改类型 | 新URI |
|---|---|---|---|---|
| 删除主机截屏 | DELETE | /UI/Rest/Maintenance/SystemDiagnostic/DeleteScreenshot | 整改ACTION | |
| SP系统擦除配置文件 | POST | /UI/Rest/BMCSettings/SPService/SystemErase | 不调整 | |
| SP系统擦除配置文件 | DELETE | /UI/Rest/BMCSettings/SPService/SystemErase | 整改URI、ACTION | /UI/Rest/BMCSettings/SPService/SystemErase/Actions/SystemErase.Delete |
| 查询工作记录 | GET | /UI/Rest/Maintenance/WorkRecord | 不调整 | |
| 修改工作记录 | PATCH | /UI/Rest/Maintenance/WorkRecord | 不调整 | |
| 创建工作记录 | POST | /UI/Rest/Maintenance/WorkRecord | 不调整 | |
| 删除工作记录 | DELETE | /UI/Rest/Maintenance/WorkRecord/:workrecord_id | 整改URI、ACTION、请求体 | /UI/Rest/Maintenance/WorkRecord |
| 查询用户 | GET | /UI/Rest/AccessMgnt/Accounts | 不调整 | |
| 修改用户 | PATCH | /UI/Rest/AccessMgnt/Accounts/:accountid | 不调整 | |
| 创建用户 | POST | /UI/Rest/AccessMgnt/Accounts | 不调整 | |
| 用户管理 | DELETE | /UI/Rest/AccessMgnt/Accounts/:accountid | 整改URI、ACTION、请求体 | /UI/Rest/AccessMgnt/Accounts/DeleteAccount |
| 证书管理 | DELETE | /UI/Rest/AccessMgnt/CertMgnt/DeleteCert | 整改ACTION | |
| ssh公钥管理 | DELETE | /UI/Rest/AccessMgnt/Accounts/:accountid/DeleteSSHPublicKey | 整改ACTION | |
| 删除会话 | DELETE | /UI/Rest/Sessions/:id | 整改URI、ACTION、请求体 | /UI/Rest/Sessions |
| 删除用户角色 | DELETE | /UI/Rest/AccessMgnt/RightManagement/:id | 整改URI、ACTION、请求体 | /UI/Rest/AccessMgnt/RightManagement |
| 下载历史功率数据 | POST | /UI/Rest/System/Power/History | 不调整 | |
| 清除历史功率数据 | DELETE | /UI/Rest/System/Power/History | 整改URI、ACTION | |
| 查询逻辑盘信息 | GET | /UI/Rest/System/Storage/:controllerid/Volumes/:volumeid | 不调整 | |
| 设置逻辑盘信息 | PATCH | /UI/Rest/System/Storage/:controllerid/Volumes/:volumeid | 不调整 | |
| 创建逻辑盘 | POST | /UI/Rest/System/Storage/:storageid/Volumes | 不调整 | |
| 删除逻辑盘 | DELETE | /UI/Rest/System/Storage/:controllerid/Volumes/:volumeid | 整改URI、ACTION、请求体 | /UI/Rest/System/Storage/:storageid/Volumes |
评审点1:运维Rest接口整改
一、变更"删除主机截屏"的WebRest接口
调整前原有相关接口:
1、触发手动截屏:POST /UI/Rest/Maintenance/SystemDiagnostic/CaptureScreenshot(不调整)
2、删除手动截屏: DELETE /UI/Rest/Maintenance/SystemDiagnostic/DeleteScreenshot(调整操作类型,DELETE → POST)
uri:/UI/Rest/Maintenance/SystemDiagnostic/DeleteScreenshot(已有)
变化类型:变更操作类型
操作类型:从Delete 变更为 Post
操作权限:DiagnoseMgmt
应用场景:用于删除主机截屏
二、变更"删除SP系统擦除配置文件"功能的WebRest接口
调整前原有相关接口:
1、创建SP系统擦除配置文件:POST /UI/Rest/BMCSettings/SPService/SystemErase(不调整)
2、删除SP系统擦除配置文件: DELETE /UI/Rest/BMCSettings/SPService/SystemErase(1、调整URI:SPService/SystemErase->SPService/SystemErase/Actions/SystemErase.Delete;2、调整操作类型,DELETE → POST)
变更"删除SP系统擦除配置文件"功能的接口
uri:/UI/Rest/BMCSettings/SPService/SystemErase变更为/UI/Rest/BMCSettings/SPService/SystemErase/Actions/SystemErase.Delete
变化类型:1)变更URI;2)变更操作类型;
操作类型:Delete变更为Post
操作权限:BasicSetting
应用场景:用于删除SP系统擦除配置文件。
详细描述:
三、变更"删除工作记录"功能的接口
调整前原有相关接口:
1、获取工作记录:GET /UI/Rest/Maintenance/WorkRecord(不调整)
2、添加工作记录:POST /UI/Rest/Maintenance/WorkRecord(不调整)
3、编辑工作记录:PATCH /UI/Rest/Maintenance/WorkRecord(不调整)
4、删除工作记录:DELETE /UI/Rest/Maintenance/WorkRecord/ID(1、调整URI名称,WorkRecord/ID → WorkRecord;2、调整操作类型,DELETE → POST;3、新增请求体属性:RequestMethod、Id)
变更"删除工作记录"功能的接口
uri:/UI/Rest/Maintenance/WorkRecord/:workrecord_id 变更为 /UI/Rest/Maintenance/WorkRecord
变化类型:1)变更接口URI;2)变更操作类型;3)新增请求体属性
操作类型:从Delete变更为POST
应用场景:用于对工作记录进行操作,目前支持创建和删除
详细描述:
请求体如下:
| 属性名称 | 取值类型 | 变化类型 | 是否为必传参数 | 默认值 | 取值约束 | 描述 |
|---|---|---|---|---|---|---|
| RequestMethod | 字符串 | 新增属性 | 否 | “POST” | 枚举值:“POST”、“DELETE” | post接口调用时的请求方法,用于确认本次调用创建(POST)还是删除(DELETE)工作记录的功能 |
| Id | 字符串 | 新增属性 | 否 | NA | NA | 要删除的工作记录Id。 RequestMethod为"DELETE"时必传; RequestMethod非“DELETE”时传入该参数报PropertyUnknown。 |
| Content | 字符串 | 已有属性 | 否 | NA | NA | 要记录的内容。 RequestMethod为"POST"时必传。 RequestMethod非“POST”时传入该参数报PropertyUnknown。 |
PS:编辑工作记录的请求体中,Id也是字符串类型。
响应体如下:
| 属性名称 | 取值类型 | 描述 |
|---|---|---|
| TotalNumber | 数字 | 工作记录的数量 |
| List | 对象数组 | 所有工作记录的信息 |
| Id | 字符串 | 工作记录的Id |
| UserName | 字符串 | 最后一次编辑工作记录的用户名称 |
| IPAddress | 字符串 | 最后一次编辑工作记录的用户ip |
| Time | 字符串 | 最后一次编辑工作记录的时间 |
| Content | 字符串 | 这个工作记录Id对应的内容 |
评审点2:安全管理接口整改
如下功能的REST接口的DELETE方法需要整改:
(1)删除用户:/UI/Rest/AccessMgnt/Accounts/:accountid(删除原uri,将原有方法归并到/UI/Rest/AccessMgnt/AccountsPOST方法下)
(2)删除证书:/UI/Rest/AccessMgnt/CertMgnt/DeleteCert (变更方法 DELETE->POST)
(3)删除ssh公钥:/UI/Rest/AccessMgnt/Accounts/:accountid/DeleteSSHPublicKey (变更方法 DELETE->POST)
(4)删除会话:/UI/Rest/Sessions/:id(删除原uri,将原有方法新增/UI/Rest/SessionsPOST方法下)
(5)删除用户角色:/UI/Rest/AccessMgnt/RightManagement/:id (删除原uri,将原有方法归并到/UI/Rest/AccessMgnt/RightManagementPOST方法下)
(1)新增用户接口添加属性
变化类型:在原有接口POST下新增属性,并变更原有一部分属性的可选项。
原有删除用户URI:/UI/Rest/AccessMgnt/Accounts/:accountid
变更资源URI:/UI/Rest/AccessMgnt/Accounts
操作类型:POST(DELETE->POST)
输入参数:
| 属性 | 数据类型 | 属性说明 | 取值范围 | POST约束 | DELETE约束 |
|---|---|---|---|---|---|
| RequestMethod | string | 用于标识创建用户还是删除用户,默认使用POST | 枚举类型:“POST”,“DELETE” | 可选 | 可选 |
| ID | integer | 用户ID | 取值范围:[2, 17] | 可选 | 必选 |
| UserName | string | 用户名称 | 字符串长度:[1, 16] | 必选 | 不可选 |
| RoleID | string | 用户角色ID | 枚举类型:“NoAccess”,“CommonUser”, “Operator”,“Administrator”,“CustomRole1”,“CustomRole2”,“CustomRole3”,“CustomRole4”,“CustomRole5”,“CustomRole6”,“CustomRole7”,“CustomRole8”,“CustomRole9”,“CustomRole10”,“CustomRole11”,“CustomRole12”,“CustomRole13”,“CustomRole14”,“CustomRole15”,“CustomRole16” | 必选 | 不可选 |
| Password | string | 用户密码 | 字符串长度:[1, 20] | 必选 | 不可选 |
| LoginInterface | string | 用户能够使用的登录接口 | 枚举类型: “Web”,“SNMP”,“IPMI”,“SSH”,“SFTP”,“Local”,“Redfish” | 可选 | 不可选 |
| LoginRule | array | 用户登录规则 | 枚举类型:“Rule1”,“Rule2”, “Rule3” | 可选 | 不可选 |
| ReauthKey | string | 二次鉴权密码 | 字符串长度:[1, 128] | 必选 | 必选 |
| FirstLoginPolicy | number | 首次登录策略 | 枚举类型:1,2 | 必选 | 不可选 |
ReqBody请求体示例(POST):
{
"RequestMethod":"POST",(可选)
"UserName": "test",
"RoleID":"Administrator",
"Password":"XXXXXX",
"ReauthKey":"xxxxx",
"FirstLoginPolicy":1
}
ReqBody请求体示例(DELETE):
{
"RequestMethod":"DELETE"
"ID": 3,
"ReauthKey":"QWR12taWwMDA"
}
(2)变更删除证书接口方法
变化类型:操作类型变更(DELETE → POST)
资源URI:/UI/Rest/AccessMgnt/CertMgnt/DeleteCert
操作类型:POST
输入参数:
| 属性 | 数据类型 | 属性说明 | 取值范围 | 约束 |
|---|---|---|---|---|
| CertificateType | int | 删除证书类型 | 取值范围:[0, 4] | 必选 |
| ID | int | 删除的证书的ID | 取值长度:[0, 32] | 必选 |
ReqBody请求体示例:
{
"CertificateType":0,
"ID": 1
}
(3)变更删除ssh公钥接口方法
变化类型:操作类型变更(DELETE → POST)
资源URI:/UI/Rest/AccessMgnt/Accounts/:accountid/DeleteSSHPublicKey
操作类型:POST
输入参数:
| 属性 | 数据类型 | 属性说明 | 取值范围 | 约束 |
|---|---|---|---|---|
| ReauthKey | string | 二次鉴权密码 | 字符串长度:[1, 128] | 必选 |
ReqBody请求体示例:
{
"ReauthKey":"QWR12taWwMDA",
}
(4)新增删除用户会话接口
变化类型:新增接口
原有删除用户URI :/UI/Rest/Sessions/:id
变更资源URI :/UI/Rest/Sessions
操作类型:POST
输入参数:
| 属性 | 数据类型 | 属性说明 | 取值范围 | 约束 |
|---|---|---|---|---|
| RequestMethod | string | 标识用于删除会话ID | 枚举类型:“DELETE” | 必选 |
| SessionId | string | 用户会话ID | 资源树校验 | 必选 |
ReqBody请求体示例:
{
"RequestMethod": "DELETE",
"SessionId": "c482ad820d6453424d1af86e",
}
(5)新增用户角色接口添加属性
变化类型:新增接口属性
变更资源URI:/UI/Rest/AccessMgnt/RightManagement
原有删除用户角色URI:/UI/Rest/AccessMgnt/RightManagement/:id
操作类型:POST
输入参数:
| 属性 | 数据类型 | 属性说明 | 取值范围 | 约束 |
|---|---|---|---|---|
| RequestMethod | string | 用于标识创建用户角色还是删除用户角色,默认使用POST | 枚举类型:“DELETE”,“POST” | 可选 |
| ID | integer | 用户角色ID | 取值范围:[8, 20] | 必选 |
| ReauthKey | string | 二次鉴权密码 | 字符串长度:[1, 128] | 必选 |
ReqBody请求体示例(POST):
{
"RequestMethod":"POST",(可选)
"ID": 10,
"ReauthKey":"QWR12taWwMDA",
}
ReqBody请求体示例(DELETE):
{
"RequestMethod": "DELETE"
"ID": 10,
"ReauthKey":"QWR12taWwMDA",
}
评审点4:能效管理接口整改
1、如下功能的REST接口的DELETE方法需要整改:
(1)原有历史功率数据Uri:/UI/Rest/System/Power/History(删除DELETE方法,将删除方法归并到POST方法下)
(1)新增下载历史功率接口属性
变化类型:新增接口属性
资源URI:/UI/Rest/System/Power/History
操作类型:POST
输入参数:
| 属性 | 数据类型 | 属性说明 | 取值范围 | 约束 |
|---|---|---|---|---|
| DataType | string | 删除数据类型 | 枚举类型"System",“Fan”,“Cpu”,“Memory” | 必选 |
| SystemId | int | 系统ID | 系统ID是否存在 | 可选 |
| RequestMethod | string | 用于标识下载历史功率接口或者删除,默认使用POST | 枚举类型:“DELETE”,“POST” | 必选 |
ReqBody请求体示例(POST):
{
"RequestMethod":"POST",(可选)
"DataType": "System",
"SystemId": 1
}
ReqBody请求体示例(DELETE):
{
"RequestMethod": "DELETE"
"DataType": "System",
"SystemId": 1
}
评审点4:通用硬件接口整改
相关接口:
(1)查询逻辑盘信息:/UI/Rest/System/Storage/:controllerid/Volumes/:volumeid(Get操作)
(2)设置逻辑盘信息:/UI/Rest/System/Storage/:controllerid/Volumes/:volumeid(Patch操作)
(3)创建逻辑盘:/UI/Rest/System/Storage/:storageid/Volumes(Post操作)
(4)删除逻辑盘:/UI/Rest/System/Storage/:controllerid/Volumes/:volumeid(Delete操作)
1、 删除用于“删除逻辑盘”的WebRest接口Delete操作
资源URI (已有):/UI/Rest/System/Storage/:controllerid/Volumes/:volumeid
变化类型 :删除操作类型
操作类型 :Delete
应用场景 :删除逻辑盘
操作权限 :BasicSetting
输入参数 :无
2、变更用于“创建逻辑盘”的WebRest接口
资源URI(已有):/UI/Rest/System/Storage/:storageid/Volumes
变化类型:新增输入参数
操作类型:Post
应用场景:用于创建和删除逻辑盘(删除功能与原uri /UI/Rest/System/Storage/:controllerid/Volumes/:volumeid下的Delete操作一致,创建功能与原/UI/Rest/System/Storage/:storageid/Volumes下的功能一致)
操作权限:BasicSetting
输入参数:
参数变更:
| 属性 | 数据类型 | 属性说明 | 取值范围 | 约束 |
|---|---|---|---|---|
| VolumeIds(新增) | Array(string) | 要删除的逻辑盘Id数组 | 数组元素(要删除的逻辑盘Id)的取值范围为字符串 | 当RequestMethod为“POST”时为不可选,当RequestMethod为“DELETE”时为必选 |
| RequestMethod(新增) | string | 操作类型,当取值为“POST”时,实现创建逻辑盘功能;当取值为“DELETE”时,实现删除逻辑盘功能 | 枚举值:“POST”、“DELETE”,默认值为“POST”。 | 可选 |
| Drives(已有) | Array(number) | 物理盘Id数组 | 数组元素(物理盘Id)的取值范围为number | 当RequestMethod为“POST”时为必选,当RequestMethod为“DELETE”时不可选 |
| VolumeRaidLevel(已有) | string | RAID级别 | 枚举值:“RAID0”, “RAID1”,“RAID5”, “RAID6”, “RAID10”,“RAID50”,“RAID60”, “RAID1(ADM)”,“RAID10(ADM)”,“RAID1Triple”,“RAID10Triple” | 当RequestMethod为“POST”时为必选,当RequestMethod为“DELETE”时不可选 |
ReqBody请求体示例:
创建逻辑盘:
{
"RequestMethod": "POST",
"Drives": [0, 1],
"VolumeRaidLevel": "RAID0"
}
删除逻辑盘:
{
"RequestMethod": "DELETE",
"VolumeIds": [“LogicalDrive238”]
}
评审结论
遗留问题
1、需要到TC组织汇报,同步变更的背景和变更方式
结果:
2、需要加门禁/其他方式禁止开发者新增WebRest的delete接口
结果:
3、rackmount仓的Readme需要添加对应的修改(webrest接口不允许添加delete)
结果:
4、是否要改成post类型接口的请求参数中添加操作类型的参数,通过这个参数控制是Post还是Delete,默认为Post。然后删除Delete接口
结果:已闭环,见各个评审点
5、要提前在社区发布变更说明
结果: