Everyone rebuilds it, badly
Every product needs users, roles, and permissions. Teams rebuild the same tables, the same resolution logic, and the same admin screens — and each rebuild ships its own bugs.
Everyone rebuilds it, badly
Every product needs users, roles, and permissions. Teams rebuild the same tables, the same resolution logic, and the same admin screens — and each rebuild ships its own bugs.
Role checks aren't enough
hasRole("ADMIN") can’t express “loan officers may approve loans but never see the SSN
field.” Real products need feature, action, and field-level decisions — with DENY
winning conflicts.
The frontend lies
Hiding a button is not access control. If the backend isn’t the single source of truth,
every hidden feature is one curl away.
Three-tier permissions
Feature access → action rights → field visibility, resolved in one call. DENY always beats ALLOW; no permission means no access.
Minutes to running
One starter dependency, two lines of yml, dev-mode: true. Migrations run, a tenant and
admin are seeded, and your @RequiresPermission annotations auto-register your resources.
Pluggable everything
Cache: memory, Redis, or off. Database: PostgreSQL or MySQL. Tenancy: row-level, schema-per-tenant, or database-per-tenant. Every choice is a config value with a safe default — every default overridable with your own bean.
Backend is the source of truth
The React library renders what the backend permits — FeatureGuard, ActionGuard,
FieldGuard — but enforcement always lives server-side.
iam: dev-mode: true # local dev: secrets auto-generated@GetMapping("/loans")@RequiresPermission(resource = "loans", action = "read")fun list(): List<LoanDto> = loanService.findAll()That annotation doesn’t just protect the endpoint — at startup it registers the loans
resource and its read action, ready for permission assignment in the admin UI.
Backend
Spring Boot 3 starter (Kotlin): JWT auth, OAuth2/OIDC login, 2FA, password reset, rate limiting, audit trail, scoped RBAC, Flyway migrations, OpenAPI.
Frontend
@mpofusindie/iam-react: provider, hooks, and guard components. Plus a standalone admin
dashboard for users, roles, groups, and the permission matrix.