SCIM group sync → project roles
SCIM provisioning (Admin → SCIM) keeps users and groups in sync with your IdP, but syncing a group alone grants no project visibility — see Core concepts for why config-mapped groups and role_bindings rows are independent. This page is the missing link: how to take a SCIM-synced group and bind it to a project role, so every member of that group sees the project immediately, with no per-user action.
1. Provision the group via SCIM
Entra ID (P1 or higher)
- Enterprise applications → your app → Provisioning, same bearer token and tenant URL as the SCIM admin page setup for users.
- Under Mappings, confirm Provision Azure Active Directory Groups is enabled (it is off by default on some app templates).
- In Provisioning → assigned users and groups, assign the group, not just individual users — Entra only pushes a
GroupSCIM resource (and its members) for groups actually in scope. - Run Provision on demand (or wait for the ~40 min sync cycle) and confirm the group appears under Provisioning logs with a
Successcreate Groupevent.
authentik
- Directory → Groups — create or pick the group, add members.
- Applications → Providers → Create → SCIM Provider, point it at
https://<domain>/scim/v2with the same bearer token as the SCIM admin page. - Applications → your app → Bindings, bind the SCIM provider, and under the provider's User/Group filtering make sure the group is included (authentik's default SCIM provider syncs all directory groups unless scoped).
- Trigger a sync from the provider's Sync tab and confirm the group shows a green sync status.
Either way, the group now exists in OrbitalReg's groups table — confirm it under Admin → Permissions, described next.
2. Bind the group to a project role
- Admin → Permissions → Add binding.
- Target: Group (name). Once at least one SCIM-synced group exists, this field is a dropdown sourced from
GET /api/admin/permissions/groups(org_admin-only) — pick the synced group by name instead of typing it. This matters: a free-text group name that doesn't exactly match what the IdP sends creates a new, never-synced group that silently grants nothing. - Pick the Project (or leave "— org-wide —") and the Role, then Add binding.
No further action is needed — role_bindings.group_id is now bound, and visibility.go's group join picks it up on the member's next request.
3. Verify
- As the group member: log out and back in, then check
https://<domain>/auth/whoami— the project should appear in the visible-projects list without any per-user binding. - As org_admin: the binding shows up in Admin → Permissions under the bound project (or "org-wide"), with the group's member count visible in the dropdown next time you add another binding.
- If the member still sees nothing: confirm the SCIM sync actually ran (Entra provisioning logs / authentik sync status show a
Successgroup event, not just users), and thatGET /api/admin/permissions/groupslists the group with a non-zero member count — a0here means SCIM synced the group but not its membership.