1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
| class AdvancedPolicyEngine {
constructor() {
this.policies = new Map();
this.auditLog = [];
}
addPolicy(policy) {
this.policies.set(policy.name, policy);
}
async evaluateAccess(context) {
const decisions = [];
const startTime = Date.now();
try {
for (const policy of this.policies.values()) {
const decision = {
policyName: policy.name,
effect: policy.effect,
matches: await policy.evaluate(context),
timestamp: new Date()
};
decisions.push(decision);
if (decision.matches && policy.effect === 'deny') {
this.logDecision(context, decisions, 'denied');
return false;
}
}
const finalDecision = decisions.some(d => d.matches && d.effect === 'allow');
this.logDecision(context, decisions, finalDecision ? 'allowed' : 'denied');
return finalDecision;
} catch (error) {
this.logError(context, error);
throw error;
}
}
logDecision(context, decisions, result) {
const logEntry = {
timestamp: new Date(),
user: context.user.name,
resource: context.resource,
action: context.action,
decisions: decisions,
finalResult: result,
contextSnapshot: { …context }
};
this.auditLog.push(logEntry);
}
logError(context, error) {
const errorEntry = {
timestamp: new Date(),
type: 'error',
user: context.user.name,
error: error.message,
stack: error.stack,
context: { …context }
};
this.auditLog.push(errorEntry);
}
getAuditLog(filters = {}) {
return this.auditLog.filter(entry => {
return Object.entries(filters).every(([key, value]) =>
entry[key] === value
);
});
}
}
|