UNPKG

@gftdcojp/ksqldb-orm

Version:

ksqldb-orm - Server-Side TypeScript ORM for ksqlDB with enterprise security extensions

129 lines 3.81 kB
"use strict"; /** * Row Level Security (RLS) Manager * ksqlDBテーブルに対する行レベルセキュリティポリシーの管理 */ Object.defineProperty(exports, "__esModule", { value: true }); exports.rls = exports.RLSManager = void 0; const logger_1 = require("./utils/logger"); /** * Row Level Security Manager * ksqlDBでのRLSポリシー管理を提供 */ class RLSManager { constructor() { this.policies = new Map(); } /** * シングルトンインスタンスを取得 */ static getInstance() { if (!RLSManager.instance) { RLSManager.instance = new RLSManager(); } return RLSManager.instance; } /** * RLSポリシーを作成 */ createPolicy(options) { const policyName = options.policyName || `${options.tableName}_policy_${Date.now()}`; const policyId = `${options.tableName}_${policyName}`; const policy = { id: policyId, tableName: options.tableName, policyName, condition: options.condition, roles: options.roles, operation: options.operation || 'ALL', enabled: true }; this.policies.set(policyId, policy); logger_1.log.info(`RLS Policy created: ${policyName} for table ${options.tableName}`); return policy; } /** * ポリシーを有効化 */ enablePolicy(policyId) { const policy = this.policies.get(policyId); if (policy) { policy.enabled = true; logger_1.log.info(`RLS Policy enabled: ${policy.policyName}`); return true; } return false; } /** * ポリシーを無効化 */ disablePolicy(policyId) { const policy = this.policies.get(policyId); if (policy) { policy.enabled = false; logger_1.log.info(`RLS Policy disabled: ${policy.policyName}`); return true; } return false; } /** * ポリシーを削除 */ dropPolicy(policyId) { const policy = this.policies.get(policyId); if (policy) { this.policies.delete(policyId); logger_1.log.info(`RLS Policy dropped: ${policy.policyName}`); return true; } return false; } /** * テーブルのポリシー一覧を取得 */ getPoliciesForTable(tableName) { return Array.from(this.policies.values()) .filter(policy => policy.tableName === tableName); } /** * 全ポリシー一覧を取得 */ getAllPolicies() { return Array.from(this.policies.values()); } /** * ユーザーとロールに基づいてクエリ条件を生成 */ generateQueryCondition(tableName, userRoles) { const policies = this.getPoliciesForTable(tableName) .filter(policy => policy.enabled) .filter(policy => policy.roles.some(role => userRoles.includes(role))); if (policies.length === 0) { return null; } // 複数ポリシーがある場合はANDで結合 const conditions = policies.map(policy => `(${policy.condition})`); return conditions.join(' AND '); } } exports.RLSManager = RLSManager; RLSManager.instance = null; /** * 便利関数のエクスポート */ exports.rls = { /** * ポリシー作成のショートカット */ createPolicy: (options) => { return RLSManager.getInstance().createPolicy(options); }, /** * マネージャーインスタンスを取得 */ getManager: () => { return RLSManager.getInstance(); } }; exports.default = RLSManager; //# sourceMappingURL=row-level-security.js.map