Skip to content

对象权限

NetBox使用一种新的基于对象的权限框架,取代了Django内置的权限模型。基于对象的权限使管理员能够授予用户或组在NetBox中对任意对象子集执行操作的权限,而不是对某种类型的所有对象。例如,可以授予用户仅查看特定地区站点或仅修改特定范围内数值ID的VLAN的权限。

NetBox中的权限表示多个组件共享的关系:

  • 对象类型 - NetBox中的一个或多个对象类型
  • 用户/组 - 一个或多个用户或用户组
  • 操作 - 可以在对象上执行的操作
  • 约束 - 用于限制授予的操作仅适用于特定对象子集的任意筛选器

至少,权限分配必须指定一个对象类型、一个用户或组和一个操作。约束的规范是可选的:没有指定任何约束的权限将适用于所选模型的所有实例。

操作

在NetBox中,每种对象类型都可以允许四种核心操作,大致类似于CRUD约定(创建、读取、更新和删除):

  • 查看 - 从数据库检索对象
  • 添加 - 创建新对象
  • 更改 - 修改现有对象
  • 删除 - 删除现有对象

除了这些操作,权限还可以授予可能由特定模型或插件需要的自定义操作。例如,脚本的run权限允许用户执行自定义脚本。这些可以在“附加操作”字段中指定。

注意

在内部,权限授予的所有操作(包括内置和自定义操作)都存储为字符串,存储在名为actions的数组字段中。

约束

约束被表示为一个JSON对象或列表,表示Django查询筛选器。这与在使用Django ORM执行查询时传递给QuerySet filter()方法的语法相同。与查询筛选器一样,双下划线可以用于穿越相关对象或调用查找表达式。下面显示了一些示例查询及其相应的定义。

在单个JSON对象中定义的所有属性都将应用逻辑AND。例如,假设为站点模型分配了具有以下约束的权限。

{
  "status": "active",
  "region__name": "Americas"
}

该权限将仅授予具有“活动”状态分配给“美洲”地区的站点的访问权限。

要使用不同一组约束实现逻辑OR,请在列表中定义多个对象。例如,如果要将权限限制为具有ID介于100和199之间的VLAN 具有“保留”状态的VLAN,请执行以下操作:

[
  {
    "vid__gte": 100,
    "vid__lt": 200
  },
  {
    "status": "reserved"
  }
]

此外,如果为对象类型分配了多个权限,则将使用逻辑“OR”操作合并它们的约束。

用户令牌

在定义权限约束时,管理员可以使用特殊令牌$user来引用评估时的当前用户。这对于将用户限制在仅编辑自己的日志条目等情况下很有帮助。这样的约束可能定义为:

{
  "created_by": "$user"
}

$user令牌仅可用作约束值,或作为值列表中的项目。不能修改或扩展$user令牌以引用特定的用户属性。

默认权限

此功能在NetBox v3.6中引入。

尽管权限通常分配给特定的组和/或用户,但也可以定义一组默认权限,适用于_所有_已认证的用户。这是使用DEFAULT_PERMISSIONS配置参数完成的。请注意,不支持为特定用户或组静态配置权限。

示例约束定义

约束 描述
{"status": "active"} 状态为活动
{"status__in": ["planned", "reserved"]} 状态为活动 保留
{"status": "active", "role": "testing"} 状态为活动 角色为测试
{"name__startswith": "Foo"} 名称以“Foo”开头(区分大小写)
{"name__iendswith": "bar"} 名称以“bar”结尾(不区分大小写)
{"vid__gte": 100, "vid__lt": 200} VLAN ID 大于等于100 小于200
[{"vid__lt": 200}, {"status": "reserved"}] VLAN ID 小于200 状态为保留

权限执行

查看对象

基于对象的权限通过过滤用户请求生成的数据库查询来工作,以限制返回的对象集。当接收到请求时,NetBox首先确定用户是否已经进行了身份验证并被授予执行所请求操作的权限。例如,如果请求的URL是/dcim/devices/,NetBox将检查dcim.view_device权限。如果用户尚未被分配此权限(无论是直接分配还是通过组分配),NetBox将返回403(禁止)的HTTP响应。

如果授予了权限,NetBox将编译模型和操作的任何指定约束。例如,假设已向用户分配了两个权限,授予对设备模型的查看访问权限,并具有以下约束:

[
    {"site__name__in":  ["NYC1", "NYC2"]},
    {"status":  "offline", "tenant__isnull":  true}
]

这允许用户访问查看任何分配给站点名称为NYC1或NYC2的设备具有“离线”状态且未分配租户的设备。这些约束等效于以下ORM查询:

Site.objects.filter(
    Q(site__name__in=['NYC1', 'NYC2']),
    Q(status='active', tenant__isnull=True)
)

创建和修改对象

当用户尝试在NetBox中创建或修改对象时,会采用相同类型的逻辑,但有所不同。一旦验证完成,NetBox会启动一个原子数据库事务以促进更改,并且对象会以正常方式创建或保存。接下来,在事务内部,NetBox会发出第二个查询,以检索新创建/更新的对象,过滤受限制的查询集合以使用对象的主键。如果此查询未能返回对象,NetBox知道新修订与权限强加的约束不匹配。然后会回滚事务,将数据库还原到更改之前的原始状态,并通知用户违规行为。