权限访问控制介绍
更新时间:2025/06/27
在Gitcode上查看源码在数据模型中需要支持根据openUBMC的用户权限模型指定接口方法、属性及ipmi命令的访问权限,用于对属性、方法及ipmi命令访问时进行鉴权。
关键特性
数据模型新增privilege字段用于指定九大权限
九大权限
"UserMgmt", "BasicSetting", "KVMMgmt", "VMMMgmt", "SecurityMgmt", "PowerMgmt", "DiagnoseMgmt", "ReadOnly", "ConfigureSelf"
权限说明
用户可以拥有一个或多个权限,用户对接口方法、属性或ipmi命令进行访问时,必须拥有数据模型指定的所有访问权限才允许用户进行访问
model.json
中支持指定属性、方法的访问权限
权限模型
path
权限、interface
权限、property
/method
权限间存在多重继承关系,例如path
配置了UserMgmt
权限,那么访问该path
下的任何属性方法都需要拥有UserMgmt
权限
语法定义
json
{
"ClassA":{
"path":"bmc/kepler/xxx/${id}",
"privilege":["UserMgmt", "BasicSetting"], // 资源树 path 访问权限语法定义
"interfaces":{
"bmc.kepler.IClassA":{
"privilege":["SecurityMgmt"], // 资源树 interface 访问权限语法定义
"properties":{
"PropA1":{
"usage":["CSR", "PoweroffPer"],
"privilege":{ // 资源树 property 访问权限语法定义,需要分别指明读写权限
"read":["ReadOnly"],
"write":["ConfigureSelf"]
}
}
},
"methods":{ // 资源树 method 访问权限语法定义
"Method1":{
"privilege":["DiagnoseMgmt"]
}
}
}
}
}
}
ipmi.json
中支持IPMI命令的访问权限
语法定义
json
{
"package":"XXIpmiCmds",
"cmds":{
"CmdName1":{
"netfn":"0x06",
"cmd":"0x01",
"priority":"Default",
"role":"Administrator",
"privilege":["PowerMgmt"], //执行该命令时用户需要的权限
"req":[
{"data":"lana","baseType":"U32", "len":"3B", "value" = "0x07db"},
{"data":"SubCmd","baseType":"U8", "len":"1B", "value" = "0x02"},
{"data":"Reserved","baseType":"U8", "len":"4b"},
{"data":"ChannelNum","baseType":"U8", "len":"4b"},
{"data":"Length","baseType":"U16", "len":"2B"},
{"data":"Data","baseType":"U8[]", "len":"Length"},
{"data":"Sign","baseType":"String", "len":"64B"},
{"data":"Padding","baseType":"U8[]", "len":"*"}
],
"rsp":[
{"data":"lana","baseType":"U32", "len":"3B"}
],
"sysLockedPolicy":"Allowed"
},
"CmdName2":{
}
}
}
北向接口适配
上下文新增Privilege字段
使用privilege
库的get_privilege
方法计算实际权限,塞入上下文的Privilege
字段
lua
local mc_privilege = require 'mc.privilege'
local mc_context = require 'mc.context'
mc_context.get_context().Privilege = mc_privilege.get_privilege(privs)
上下文新增Auth字段
上下文的Auth
字段塞入privilege
库的AuthRequired
选项,表示北向接口向业务组件发起的请求需要鉴权
lua
local mc_privilege = require 'mc.privilege'
local mc_context = require 'mc.context'
mc_context.get_context().Auth = mc_privilege.AuthOption.AuthRequied
常见问题
鉴权结果与预期不符
1)优先排查资源协作接口权限是否配置正确、是否重新生成代码 2)找北向接口确认用户权限是否正确
Redfish权限不足错误码规则
PATCH
属性映射到RPC接口的,使用InsufficientPrivilege
错误码。 PATCH
属性映射到资源树属性的,使用PropertyModificationNeedPrivilege
错误码。 POST
等其他操作,使用InsufficientPrivilege
错误码。