ui/docs/policy-aggregator.md
A utility for aggregating multiple Vault policies by combining capabilities for duplicate paths without duplication.
import { aggregatePolicies } from 'vault/utils/policy-aggregator';
const policy1 = `
# Comment example
path "/foo" {
capabilities = ["create"]
}
path "/foo/bar" {
capabilities = ["create", "read", "update"]
}
`;
const policy2 = `
path "/foo" {
capabilities = ["delete"]
}
path "/bar" {
capabilities = ["patch", "delete"]
}
`;
const result = aggregatePolicies([policy1, policy2]);
The function returns an object with two properties:
policy ObjectAn object with paths as keys and arrays of capabilities as values:
{
"/foo": ["create", "delete"],
"/foo/bar": ["create", "read", "update"],
"/bar": ["delete", "patch"]
}
policyString StringA formatted HCL string matching the input format:
path "/foo" {
capabilities = ["create", "delete"]
}
path "/foo/bar" {
capabilities = ["create", "read", "update"]
}
path "/bar" {
capabilities = ["delete", "patch"]
}
aggregatePolicies(policyStrings: string[]): AggregatePolicyParameters:
policyStrings: Array of HCL-formatted Vault policy stringsReturns:
interface AggregatePolicy {
policy: {
[path: string]: string[];
};
policyString: string;
}
When a user has multiple policies assigned, aggregate them to see their effective permissions:
const userPolicies = getUserPolicies(userId);
const effective = aggregatePolicies(userPolicies);
console.log('Effective permissions:', effective.policy);
Analyze which paths have overlapping capabilities across different policies:
const result = aggregatePolicies(allPolicies);
Object.entries(result.policy).forEach(([path, caps]) => {
if (caps.length > 3) {
console.log(`Path ${path} has many capabilities:`, caps);
}
});
Create a single merged policy from multiple sources:
const merged = aggregatePolicies([adminPolicy, devPolicy, readPolicy]);
// Use merged.policyString to create a new policy