Enforcer
Cerbos is a good product and has the shortest quickstart in this category: three commands, no account. Most people looking for an alternative are hitting one of two specific limits, so this starts there rather than with a feature grid.
If neither of those is your problem, staying put is usually the right answer.
| Option | Model | Strength | Trade-off |
|---|---|---|---|
| OpenFGA | Relationship, Zanzibar | Strong list filtering | You maintain a copy of your data, written twice |
| SpiceDB / AuthZed | Relationship, Zanzibar | Mature, good tooling | Same dual-write problem; their own CTO names it |
| Open Policy Agent | Policy, Rego | One engine for infra and app | Rego is the most complained-about language here |
| Permit.io | Policy plus MCP gateway | UI for non-engineers | Still a decision layer, still syncs |
| WorkOS FGA | Relationship plus roles | Comes with sign-in | Resources registered in their system |
| Enforcer | Policy over a resolved caller | Nothing to sync; identity included | List filtering only over Enforcer’s own resource types. The engine compiles the same policy into a SQL WHERE clause by partial evaluation, exposed over gRPC as CompileFilter, but only for the eleven types registered in Enforcer’s own process. There is no REST endpoint for it and no way to register your own tables, so it cannot filter your data. |
Cerbos is stateless, so you pass the context in on every request. Enforcer signed the user in, so the policy is handed the resolved caller with role, tenant and group memberships already attached. Neither of us makes you maintain a shadow database, which is the real dividing line in this category.
Being straight about it: our list filtering covers only our own resource types, not yours. If that is why you are here, a relationship engine is your answer, not us.