权限访问控制介绍
更新时间: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错误码。