On this page
- The answer was relevant. The user wasn't allowed to see its source.
- What is permission-aware RAG?
- Why isn't filtering after search enough?
- Define the boundary every retrieval path must respect
- Which enforcement pattern should you use?
- Hybrid search multiplies the surface
- Chunks, embeddings and caches inherit restrictions
- Object access isn't field access, and neither is purpose
- Permissions change after you index
- Authorized doesn't mean trustworthy
- Measure relevance and leakage together
- Common anti-patterns
- Ten rules for permission-aware retrieval
- The result: relevance you can defend
- Frequently asked questions
- How Frozion keeps retrieval inside the requester's authority
- Sources
Permission-aware RAG checks whether the requester may use each candidate before it competes for ranking, not after. Tenant filters and post-filters aren't enough: chunks, embeddings, summaries and caches must inherit the source's object, field and purpose restrictions, permissions must be rechecked at query time, and restricted content must never reach the model.
The answer was relevant. The user wasn't allowed to see its source.
A financial-services firm runs an AI support assistant. Support specialists may see a customer's profile, billing, ordinary correspondence and refund procedures. Fraud-investigation notes and legal material attached to the same customer are restricted to Risk and Legal.
The ingestion pipeline chunks every document into one shared hybrid index. Each chunk keeps the tenant ID and customer ID. It doesn't keep the document class, field-level restrictions, purpose limits or the permission revision in force at indexing. One fraud note is later reclassified; its chunks aren't updated.
A specialist asks, "Why has this refund been delayed?" Keyword and vector search both rank the fraud note highly: it mentions the customer, the refund amount and a "manual delay." A final filter confirms the specialist is in the right tenant and may access this customer. The chunk goes through.
The model paraphrases the internal suspicion of chargeback abuse and recommends denying the refund. The answer is relevant. It's also built from information the specialist was never authorized to use.
Every component behaved. The user was authenticated, IDs matched, search returned the closest candidates and the model answered from what it was given. The access boundary was still crossed, inside a single tenant and a single customer record. Tenant isolation alone wouldn't have stopped it.
What is permission-aware RAG?
Permission-aware RAG applies the requester's access rights at every retrieval stage, so only items they may use can compete for ranking, enter the context and reach the model. Relevance is measured inside that boundary, never across the whole index.
Relevance and authorization answer different questions. Both must be true before a candidate influences anything.
| Question | What it asks | Typical inputs |
|---|---|---|
| Relevance | How well does this match the query? | Keyword match, similarity, recency, ranker score |
| Authorization | May this person or agent use this exact object or field, for this action and purpose, now? | Identity, delegation, tenant, resource, field, classification, purpose, policy |
| Admissibility | May it take part in this decision at all? | Authorization plus trust, role, freshness and residency |
| Selection | Which admissible items get the limited slots and tokens? | Ranking, run only over admissible items |
A relevant item can be unauthorized. An authorized item can be irrelevant. An item can be both and still be stale, manipulated or outside the declared purpose.
Why isn't filtering after search enough?
Because restricted items have already competed by then: they've taken top-k slots, reranker budget, diversity slots and cache entries, and pushed out items the user was entitled to. The answer can contain no restricted text and still be shaped by restricted data.
Many implementations retrieve a global top-k and remove what the user can't see. That stops direct disclosure. It doesn't stop influence. If nine of the top ten candidates are restricted, the user gets one result, not the ten best items they were allowed to see. Worse, a cache built from the unfiltered set can serve that influence to the next person.
The fix is to define the set of items a requester may use first, then rank inside it. Keep post-filtering as a last line of defense, not the first.

Define the boundary every retrieval path must respect
"Always add tenant_id to the query" is a convention, not a boundary. Write down what every retrieval path has to preserve, per use case:
| Area | What to declare |
|---|---|
| Identity | Who started the work, which agent is acting, what was delegated, when it expires |
| Enterprise scope | Tenant, legal entity, account, case, region, department, taxonomy branch |
| Object and field | Document, chunk, row, field, attachment, redacted view |
| Use | The action, business purpose and current case state |
| Information controls | Classification, privacy, residency, retention, source trust |
| Lifecycle | Permission revision, reclassification, deletion, expiry, recheck rules |
| Retrieval behavior | Which generators run, where filters apply, top-k, cache rules, fallback |
| Evidence | What was eligible, excluded and selected, and why |
You can enforce this with separate indexes, metadata filters, a policy service or a mix. The requirement isn't one topology. It's one explicit meaning of "allowed," applied the same way everywhere.
Which enforcement pattern should you use?
Usually a combination: narrow scope during candidate generation, check exact object and field access before assembling context, and recheck right before content reaches the model. No single pattern fits every corpus, policy and latency target.
| Pattern | What it does | Trade-off |
|---|---|---|
| Separate indexes or namespaces | Unreachable means un-rankable | Strong isolation; more duplication and lifecycle cost |
| Metadata pre-filtering | Pushes scope predicates into search | Works only if the engine filters before scoring and metadata is current |
| Policy-aware candidate service | Resolves allowed IDs from a policy service | Handles complex rules; must be designed for scale and failure |
| Coarse filter plus exact recheck | Fast narrowing, then precise checks | Balanced, as long as the coarse filter isn't so broad that restricted items distort ranking |
| Final recheck before the model | Catches permission changes since indexing | Defense in depth, never the first check |
When a candidate is denied, give a typed reason (denied, out of scope, field restricted, purpose not allowed, reclassified, pending deletion, unclassified) rather than an empty result. And never pass a denied item to the model with an instruction not to reveal it. By then it's already crossed the boundary.
Hybrid search multiplies the surface
Enterprise retrieval rarely means one vector query. It mixes keyword search, vectors, graph traversal, SQL, feature lookups, memory and external tools. Each needs the same boundary:
- Keyword search applies the same tenant, object, field and purpose limits as vector search.
- Query expansion, synonyms and generated sub-queries broaden meaning, never authority.
- Graph traversal checks access on every hop, not only the starting node.
- SQL and feature queries keep row, column and purpose limits instead of exporting broad results to a later filter.
- External search and tool results go through the same eligibility checks as internal sources.
Fusing globally generated candidate sets and filtering afterwards reintroduces exactly the problem you were solving.
Chunks, embeddings and caches inherit restrictions
The boundary is easiest to lose when a protected document becomes something derived from it. The source may have perfect access controls while its chunks, embeddings, summaries and cache entries carry only a tenant ID.
| Derived artifact | What it must carry or reference |
|---|---|
| Chunk | Source document and revision, inherited access attributes, field boundaries |
| Embedding | Source chunk, model version, scope, links for deletion and reclassification |
| Summary or extracted fact | Source set, transformation, inherited restrictions |
| Candidate cache | Requester scope, purpose, permission revision, index version |
| Response cache | Context, policy, scope, audience and invalidation rules |
| Derived index | Source inventory, permission sync, deletion propagation |
Chunking has to respect field and section boundaries too. A chunk that mixes ordinary correspondence with a restricted note can no longer be authorized by the document or customer ID. Split by restriction, index redacted views, or both.
Object access isn't field access, and neither is purpose
The opening failure happened inside one tenant and one customer. A person can be allowed to open an account and still be barred from its fraud notes, legal analysis, medical details or compensation fields. OWASP's API Security Top 10 separates these as object-level and property-level authorization for good reason.
Purpose matters as well. Data you may use for payroll or incident response isn't automatically usable for hiring, sales or customer service. Retrieval has to carry the purpose of the request, not just the identity behind it. For isolation between customers on shared infrastructure, see tenant isolation for agents and RAG.
Permissions change after you index
People change roles. A matter becomes privileged. A document is deleted, reclassified or moved to another legal entity. A long-running case resumes after all of that. A check made at ingestion records who could see something then, not now.
- Bind every derived artifact to the source revision and permission revision that produced it.
- Re-evaluate access at query time, and again before content reaches the model when the stakes warrant it.
- Push deletion, revocation, expiry and reclassification to every chunk, embedding, summary, cache and index.
- Quarantine items with missing or stale scope metadata instead of defaulting them to broad access.
- Keep the historical permission state for audit, but re-establish current authority before any new action.
IBM's 2025 breach research found that 97% of organizations reporting an AI-related breach lacked proper AI access controls. Stale derived artifacts are one of the quieter ways that happens.
Authorized doesn't mean trustworthy
An item can be fully authorized and still be malicious, misleading, stale or written to redirect the model. Permission-aware retrieval decides whether content may enter. It doesn't decide whether instruction-like text inside it should be obeyed. Retrieved content enters as evidence, never as instructions, and prompt-injection defenses, validation and tool controls stay separate layers. How retrieved items combine with records and policy is covered in context assembly beyond RAG.
Measure relevance and leakage together
Standard retrieval metrics ask whether relevant items rank near the top. Enterprise evaluation has to ask that inside each access boundary, and check that restricted data neither appears nor distorts results. Useful checks:
- Authorized recall: how many relevant, permitted items reach the top-k for this scope?
- Exposure rate: how often does restricted content reach the model or the user?
- Influence rate: how often do restricted items change ranking or the outcome without being shown?
- Permission lag: how long until a revocation reaches chunks, embeddings and caches?
- Cache contamination: can a result built under one scope be served under another?
Test the same query as users with different tenants, roles, purposes and field permissions, with warm and cold caches, after revocation, and with missing scope metadata.
Common anti-patterns
| Anti-pattern | Why it fails | What to do instead |
|---|---|---|
| Tenant filter only | Users can be in the tenant yet barred from objects, fields or purposes | Enforce the full scope: object, field, purpose, classification |
| Global top-k, then filter | Restricted items consume ranking and cache budgets | Define the permitted set before ranking |
| Check access only at ingestion | Roles and classifications change after indexing | Recheck at query time and before the model |
| Document ACL, no chunk ACL | Chunks and embeddings lose or mix restrictions | Propagate scope to every derived artifact |
| One cache key per query | A result built for one person is served to another | Key caches on scope, purpose, policy and permission revision |
| "The model won't reveal it" | Content already crossed the boundary and shapes output | Never send restricted content to the model |
| Citation equals authorization | A genuine source can still be off-limits | Record eligibility separately from citation |
| Delete only the source | Chunks, embeddings and caches stay searchable | Cascade deletion and revocation everywhere |
Ten rules for permission-aware retrieval
- Treat relevance and authorization as separate tests; both must pass.
- Write down the access boundary for every consequential retrieval path.
- Apply access before ranking, not after.
- Carry object, field, purpose and classification limits into every chunk, embedding, summary and cache.
- Recheck permissions at query time and before the model.
- Propagate deletion, revocation and reclassification to everything derived.
- Quarantine items with missing scope; never default to broad access.
- Treat authorized content as evidence, never as instructions.
- Measure leakage and influence alongside relevance.
- Record what was eligible, excluded and selected for each decision.
The result: relevance you can defend
Permission-aware retrieval isn't a tenant filter bolted onto one vector query, and it doesn't require one index per user. Shared infrastructure can stay efficient. What can't stay implicit is the link between relevance, authority, purpose, scope and lifecycle.
Make that link explicit and retrieval quality starts to mean something. You can explain not only why an item ranked highly, but why it was allowed to rank at all, and show that nothing outside the requester's authority shaped the answer.
Frequently asked questions
What is permission-aware RAG?
It's retrieval that applies the requester's access rights at every stage: which sources are reachable, which candidates may compete for ranking, which fields may be shown and what reaches the model. Relevance is measured only among items the requester is allowed to use.
Is filtering results after vector search enough for RAG access control?
Post-filtering stops restricted text from being shown, but restricted items have already taken top-k slots, reranker budget and cache entries, so they still shape the answer. Keep it as a final recheck, after access has been applied before ranking.
Do chunks and embeddings need their own access controls?
They need to inherit the source's restrictions, including document class, field limits, purpose, classification and permission revision. Deleting, reclassifying or de-permissioning a source must reach every chunk, embedding, summary, cache and derived index made from it.
How does this work for agents we already run?
Route the agent's retrieval and tool calls through a governed runtime over MCP or HTTPS. Each call runs under the identity of the person the agent acts for, access is checked by role, condition, scope, purpose and record before results are assembled, and what was used is recorded.
How Frozion keeps retrieval inside the requester's authority
In Frozion, every agent has its own identity, and with Agent Delegation it takes on the role of the person it acts for and never exceeds that person's authority. Authorization combines roles (RBAC) with conditions (ABAC), taxonomy scope, purpose and record-level checks, and it's rechecked when paused work resumes. Context Store & Assembly puts a checked context package behind every action, and evidence never gives orders. Provenance & Evidence records the facts each decision relied on, with scoped read-only access for auditors.
Sources
- OWASP LLM08:2025 Vector and Embedding WeaknessesUnauthorized access and leakage through vector stores and retrieval.
- OWASP API Security Top 10 (2023)API1 object-level and API3 property-level authorization.
- OWASP LLM01:2025 Prompt InjectionAuthorized content can still try to steer the model.
- NIST SP 800-207, Zero Trust ArchitectureAuthorize access per resource, not by location or membership.
- NIST SP 800-53 Rev. 5Access and information-flow enforcement, least privilege, audit.
- NIST AI 600-1, Generative AI ProfileRetrieval, data provenance and privacy risks in generative AI.
- IBM Cost of a Data Breach 202597% of organizations with an AI-related breach lacked proper AI access controls.
- W3C PROV-ONeutral model for derived artifacts and their sources.
More in Data & context
Context assembly 2
Retrieval & data access 3
State, memory & features 2
Other topics



