一、租户身份与令牌type Token = { sub: string; tenantId: string; scope: string[] } function hasScope(tok: Token, need: string) { return tok.scope.includes(need) } 二、策略映射与守卫type Policy = { route: string; method: string; scope: string } const policies: Policy[] = [ { route: '/orders', method: 'GET', scope: 'read:orders' }, { route: '/orders', method: 'POST', scope: 'write:orders' } ] function allowed(tok: Token, route: string, method: string): boolean { const p = policies.find(x => x.route === route && x.method === method) return !!p && hasScope(tok, p.scope) } type Req = { token: Token; path: string; method: string } type Res = { status: (n: number) => Res; end: (b?: string) => void } function guardRoute(req: Req, res: Res, next: Function) { if (!allowed(req.token, req.path, req.method)) return res.status(403).end('forbidden') next() } 三、参数化过滤器与查询构造type Q = { sql: string; params: any[] } function tenantFilter(tenantId: string): Q { return { sql: 'tenant_id = $1', params: [tenantId] } } function buildQuery(base: string, filter: Q, extra?: Q): Q { const parts = [filter.sql] const params = [...filter.params] if (extra) { parts.push(extra.sql); params.push(...extra.params) } const sql = `${base} WHERE ${parts.join(' AND ')} LIMIT 100` return { sql, params } } function listOrders(tok: Token): Q { return buildQuery('SELECT * FROM orders', tenantFilter(tok.tenantId)) } 四、写操作与幂等function createOrder(tok: Token, payload: { id: string; amount: number }): Q { const base = 'INSERT INTO orders(id, tenant_id, amount) VALUES($1,$2,$3)' return { sql: base, params: [payload.id, tok.tenantId, payload.amount] } } 五、验收清单路由与方法需匹配Scope;未授权拒绝并审计。查询始终包含`tenant_id`参数化过滤;限制`LIMIT`与额外条件参数化,防注入。写操作自动填充`tenant_id`;所有操作与`tenantId`绑定并可追踪。

发表评论 取消回复