Sync / roster
Bidirectional SCIM-based group-to-role provisioning sync between Grouper and PeopleSoft Campus Solutions role management.
Institutions typically define organizational groups in Grouper but still manage PeopleSoft Campus Solutions role assignments manually because PeopleSoft uses its own proprietary role and permission-list security model with no native SCIM support. This integration deploys a lightweight SCIM 2.0 translation layer that converts Grouper group memberships into PeopleSoft CS security role definitions and runs the required permission-list synchronization process.
The PeopleSoft Security Sync API uses a Component Interface pattern that requires translating external group identities into RoleName and PermListKey references and triggering the Portal Security Sync scheduled job. Mapping complexity grows quickly when groups represent dynamic academic affiliations (student, faculty, department) that must cascade across multiple permission levels.
A working piece from this integration — no sign-up. The full build handles the edge cases, safeguards, and cutover.
SCIM 2.0 Group provisioning payload from Grouper to PeopleSoft Campus Solutions, with role-mapping for the destination role security model.
// Grouper → PeopleSoft Campus Solutions (POST /psc/v1/api/security/roles/sync) Content-Type: application/scim+json Authorization: Bearer {psc_oauth_token} { "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"], "externalId": "ref:stem:bio dept:faculty", "displayName": "Biology Department Faculty", "members": [ { "value": "[email protected]", "type": "user" }, { "value": "[email protected]", "type": "user" } ], "meta": { "resourceType": "Group", "location": "https://grouper.internet2.edu/scim/v2/Groups/abc-123-def" } }
| Grouper Attribute | PeopleSoft CS Field | Notes |
|---|---|---|
displayName | ROLE_NAME | Syncs to PSROLEDEFN.ROLENAME |
externalId | DESCR | Unique stem:group reference |
members[].value | PSROLEUSER | EMPLID lookup by email suffix |
grouper:stemName | CLASSIFICATION | Maps to HR/dept/department code |
grouper:groupType | ROLETYPE | FACULTY | STAFF | STUDENT | AFFILIATE |
// PeopleSoft response confirming role provisioning HTTP 201 Created { "scimId": "BIOL_FACULTY_2024", "peopleSoftRole": "BIOL_FACULTY", "membersProvisioned": 2, "status": "active" }
How we'd take this from discovery to a production-safe cutover — the phases, the canonical mapping, and the edge cases that bite.
This integration provisions PeopleSoft Campus Solutions role memberships based on Grouper groups via SCIM 2.0, with PeopleSoft as the primary role repository and Grouper as the authoritative group source. The sync is event-driven for real-time responsiveness with periodic reconciliation jobs.
grouperGroups → PeopleSoft roles. Map SCIM displayName to ROLENAME, id to ROLEID, and members.value to OPRID in PSROLEUSER. Decide on sync mode: push from Grouper (primary) with optional pull-back for reconciliation. Define the SCIM service provider configuration in Grouper: endpoint base path (/grouper-ws/scim/v2), auth type, and attribute filter for provisioning-relevant fields only.grouper.scim.provisioner.enabled=true, set provisioning destination target, and configure the SCIM consumer endpoint URL pointing to the PeopleSoft Integration Broker service. In PeopleSoft, activate the SCIM service operation under PeopleTools > Integration Broker > Integration Setup > Services. Create or configure the inbound async handler for Users and Groups SCIM operations. Set up the integration user account with role PeopleSoft Integration User and appropriate row-level security.ROLEDEFN component interface or the PSM_ROLE REST API (PeopleTools 8.60+) to create/update roles and memberships. Implement the attribute mapping transformation logic in the Integration Broker handler or a middleware service to translate SCIM payloads to PeopleSoft row inserts into PSROLEUSER. Add logic to handle addMember and removeMember SCIM operations as role-grants and role-revocations respectively. Implement idempotency using GRPSYNCID as an external key stored in a custom cross-reference table.PS_APPSRV logs) and Integration Broker message logs for failures. Validate a sample of role assignments post-cutover against expected outcomes. Keep manual role assignment capability available for emergency overrides during the stabilization period.| Grouper SCIM Attribute | PeopleSoft Field / Component | Notes |
|---|---|---|
id (Group UUID) |
PSROLEDEFN.ROLEID |
Primary key; cross-reference stored in custom PS_GRPER_SCIM_XREF |
displayName |
PSROLEDEFN.ROLENAME |
Must match PeopleSoft naming conventions for role lookups |
members[].value |
PSROLEUSER.OPRID |
Subject identifier; resolved via NAME_SCHEMA_MAP |
members[].display |
PSOPRDEFN.OPRDEFNDESCR |
Descriptive name for audit logging |
externalId |
PS_GRPER_SCIM_XREF.GRPER_GROUP_ID |
Links PeopleSoft role to Grouper group stem path |
meta.lastModified |
PSROLEDEFN.LASTUPDTTM |
Used for delta-sync detection |
active |
PSROLEDEFN.ROLESTATUS |
0=Inactive, 1=Active; maps SCIM boolean |
addMember for unresolved OPRIDs and log to the exception queue for manual review rather than fail the entire group provisioning request.Group DELETE event. PeopleSoft does not natively cascade-delete role associations on role removal; the handler must explicitly delete the corresponding rows in PSROLEUSER and PSROLEDEFN, or set ROLESTATUS=0 to preserve audit history.INTGR_USER) to avoid infinite sync loops. Implement a source-tag attribute on synced records.PSROLEUSER may cause timeouts; implement batch-mode inserts using Application Engine programs rather than real-time message handlers for large group events.grouper.provisioning.destination.retryBehavior is configured; do not discard failed provisioning events.ROLENAME by truncating and uppercasing before upsert; store the original Grouper name in the cross-reference table for audit.Cutover must be fully reversible. Before switching to live provisioning, capture a full snapshot of PSROLEUSER and PSROLEDEFN into a backup table (PS_ROLEDEFN_BAK, PS_ROLEUSER_BAK) keyed by the current term or academic year. This snapshot serves as the authoritative rollback target. Perform a final reconciliation run comparing Grouper group memberships against the pre-cutover PeopleSoft state to surface and resolve discrepancies before going live. Schedule the cutover window immediately after a known-stable PeopleSoft cache-clear and application-server restart to avoid stale session artifacts. During the first 48 hours post-cutover, run the reconciliation job daily and retain the manual role-assignment pathway open; disable the Grouper-to-PeopleSoft provisioning destination only after the second clean reconciliation report confirms zero deltas.
Reading the reference is free. Delivering it under liability — with the safeguards that keep production running through the cutover — is what we do.