Skip to content

Debug 报告

Spectra 提供了一个在线调试工具,可以方便的查看权限规则的生效情况。以下是调试报告的格式,如果你想要在自己的系统中使用或者封装更高级的调试工具,可以参考这个格式。

请注意

此页面的类型定义仅在调试报告中使用,不是 Spectra 其他部分的类型定义,请勿混淆。

表达式 Expression

语法

typescript
// 字段名称,用于标识字段,例如:user.id, team.adminId, 或者 isOrgAdmin
type FieldName = string;

// 字段值,可以是 string, number, boolean, null, array<string | number | boolean | null>
type Value = string | number | boolean | null | array<string | number | boolean | null>;

// 操作符,例如:=, !=, >, <, >=, <=, in, not_in
type Operation = '=' | '!=' | '<>' | '>' | '<' | '>=' | '<=' | 'in' | 'not_in';

type ExpressionDebugResult = {
  // 表达式名称,用于标识表达式,例如:And, Or, Not, 或者在业务系统自定义的 isOrgAdmin
  name: string;

  // 表达式的运行结果,true 表示表达式成立,false 表示表达式不成立
  value: boolean;


  // 表达式的子表达式列表,包含一个或多个表达式, 仅在 And, Or, Not 表达式中有值
  expressions?: Array<ExpressionDebugResult>;

  // 表达式的字段左值,拥有两个属性,name 为字段名称,value 为字段运行时的值
  left?: {
    name: FieldName;
    value: Value;
  };

  // 表达式的操作符,例如:=, !=, >, <, >=, <=, in, not_in
  operation?: Operation;

  // 表达式的字段右值,拥有两个属性,name 为字段名称,value 为字段运行时的值
  right?: {
    name: FieldName|null; // 仅在字段引用时有值,否则为 null
    value: Value;
  };
};

示例

json
{
    "name": "And",
    "value": true,
    "expressions": [
        {
            "name": "Binary",
            "value": true,
            "left": {
                "name": "user.id",
                "value": 1
            },
            "operation": "=",
            "right": {
                "name": "team.adminId",
                "value": 1
            }
        },
        {
            "name": "Binary",
            "value": true,
            "left": {
                "name": "user.isTeamAdmin",
                "value": true
            },
            "operation": "=",
            "right": {
                "name": null,
                "value": true
            }
        }
    ]
}

策略 Policy

语法

typescript
type Effect = 'ALLOW' | 'DENY';

type PolicyDebugResult = {
  // 策略描述,用于描述策略的规则,例如:仅管理员可以修改团队信息
  description: string;

  // 策略的生效效果,ALLOW 表示策略通过,DENY 表示策略不通过
  effect: Effect;

  // 策略的权限列表,表示这个策略可以控制的权限,例如:['UPDATE_TEAM', 'DELETE_TEAM']
  permissions: Array<string>;

  // 策略表达式用到的字段列表,包含一个或多个字段名
  fields: Array<FieldName>;

  // 策略的应用状态
  // true: 表示这条策略被执行过判定,但不一定命中
  // false: 表示这条策略未被执行过判定
  applied: boolean;

  // 策略的运行结果
  // true: 表示这条策略被命中,则终止后续策略的判定
  // false: 表示这条策略未被命中,继续后续策略的判定
  matched: boolean;

  // 策略的表达式列表,包含一个或多个表达式
  filter: ExpressionDebugResult;
};

示例

json
{
    "description": "仅团队管理员可以删除和编辑成员",
    "effect": "ALLOW",
    "permissions": ["UPDATE_TEAM_MEMBER", "DELETE_TEAM_MEMBER"],
    "fields": ["user.isTeamAdmin", "team.id"],
    "applied": true,
    "matched": true,
    "filter": {
        "name": "And",
        "value": true,
        "expressions": [
            {
                "name": "Binary",
                "value": true,
                "left": {
                    "name": "user.isTeamAdmin",
                    "value": true
                },
                "operation": "=",
                "right": {
                    "name": null,
                    "value": true
                }
            },
            {
                "name": "Binary",
                "value": true,
                "left": {
                    "name": "team.id",
                    "value": 1
                },
                "operation": "=",
                "right": {
                    "name": "user.teamId",
                    "value": 1
                }
            }
        ]
    }
}

调试报告 Debug Report

语法

typescript
type DebugReport = {
  // 策略列表,包含一个或多个策略
  policies: Array<PolicyDebugResult>;

  // 所用到的字段列表,包含一个或多个数据
  fields: Array<FieldName>;

  // 运行过程中的数据,包含一个或多个数据
  data: {
    [key: string]: Value;
  };
};

示例

json
{
    "policies": [
        {
            "description": "仅团队管理员可以删除和编辑成员",
            "effect": "ALLOW",
            "permissions": ["UPDATE_TEAM_MEMBER", "DELETE_TEAM_MEMBER"],
            "fields": ["user.isTeamAdmin", "team.id"],
            "applied": true,
            "matched": true,
            "filter": {
                "name": "And",
                "value": true,
                "expressions": [
                    {
                        "name": "Binary",
                        "value": true,
                        "left": {
                            "name": "user.isTeamAdmin",
                            "value": true
                        },
                        "operation": "=",
                        "right": {
                            "name": null,
                            "value": true
                        }
                    },
                    {
                        "name": "Binary",
                        "value": true,
                        "left": {
                            "name": "team.id",
                            "value": 1
                        },
                        "operation": "=",
                        "right": {
                            "name": "user.teamId",
                            "value": 1
                        }
                    }
                ]
            }
        }
    ],
    "fields": ["user.isTeamAdmin", "team.id", "user.teamId"],
    "data": {
        "user.isTeamAdmin": true,
        "team.id": 1,
        "user.teamId": 1
    }
}

基于 MIT 许可发布