UNPKG

database-proxy

Version:

Through a set of access control rules configuration database access to realize the client directly access the database via HTTP.

68 lines (67 loc) 2.46 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.QueryHandler = void 0; const security_1 = require("../../utils/security"); const constraint_1 = require("../../utils/constraint"); /** * 对 query 对象进行验证 * 1. 如果配置为数组,则代表只允许数组内的字段名做为查询条件,如 ['id', 'status'] * 2. 如果配置为对象,也只允许使用对象内的字段名做为查询条件,并对每个字段做约束性检查 * @param config 验证器配置,可为数组或对象 * @param context 上下文 * @returns */ const QueryHandler = async function (config, context) { // 缺省时,直接通过 if (config === undefined) { return null; } const { query } = context.params; if (!query) return 'query is undefined'; if (typeof query !== 'object') return 'query must be an object'; // 数组代表只允许出现的字段 if (config instanceof Array) { return checkWithArray(config, context); } // 如果是对象,则 key 为字段名,值为字段约束条件 if (typeof config === 'object') { return checkWithObject(config, context); } return 'config error: config must be an array or object'; }; exports.QueryHandler = QueryHandler; /** * 如果配置规则为数组,则代表限定的 query 字段列表 * @param fields 允许的字段 * @param context 上下文 * @returns */ function checkWithArray(fields, context) { const { query } = context.params; const input_fields = security_1.SecurityUtil.resolveFieldFromQuery(query); const error = security_1.SecurityUtil.isAllowedFields(input_fields, fields); return error; } /** * 如果配置为对象,则对其中每个字段进行约束检查 * @param object 字段及其约束 * @param context 上下文 * @returns */ async function checkWithObject(object, context) { const { query } = context.params; const input_fields = security_1.SecurityUtil.resolveFieldFromQuery(query); const allow_fields = Object.keys(object); let error = security_1.SecurityUtil.isAllowedFields(input_fields, allow_fields); if (error) return error; const constraint = new constraint_1.Constraint(context, query); for (const field of allow_fields) { error = await constraint.constraintField(field, object[field]); if (error) return error; } return null; }