@gftdcojp/ksqldb-orm
Version:
ksqldb-orm - Server-Side TypeScript ORM for ksqlDB with enterprise security extensions
129 lines • 3.81 kB
JavaScript
;
/**
* 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