# User Full Access Report

LLMS index: [llms.txt](/llms.txt)

---

<div id="pslens-context-panel" class="card border-info mb-4 d-none">
  <div class="card-header bg-light text-info py-2 fw-bold d-flex align-items-center border-bottom border-info-subtle">
    <i class="bi bi-info-circle-fill me-2"></i>
    <span>Tailored Operational Context</span>
  </div>
  <div class="card-body p-0">
    <ul class="list-group list-group-flush">
      <li id="row-db" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none">
        <strong>Target Database:</strong>
        <span id="ctx-db" class="badge bg-secondary font-monospace">&mdash;</span>
      </li>
      <li id="row-type" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none">
        <strong>Context Type:</strong>
        <span id="ctx-type" class="badge bg-light text-dark border font-monospace text-uppercase">&mdash;</span>
      </li>
      <li id="row-severity" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none">
        <strong>Alert Severity:</strong>
        <span id="ctx-severity" class="badge">&mdash;</span>
      </li>
      <li id="row-time" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none">
        <strong>Triggered Time:</strong>
        <span id="ctx-time" class="text-muted small">&mdash;</span>
      </li>
      <li id="row-details" class="list-group-item py-2 d-none">
        <strong id="label-details" class="d-block mb-1">Firing Context:</strong>
        <code id="ctx-details" class="d-block p-2 bg-light border rounded small" style="white-space: pre-wrap; word-break: break-all;">&mdash;</code>
      </li>
    </ul>
  </div>
</div>

<script>
  (function() {
    const params = new URLSearchParams(window.location.search);
    const metadata = params.get('metadata');
    if (!metadata) return;

    try {
      
      const base64 = metadata.replace(/-/g, '+').replace(/_/g, '/');
      const jsonStr = decodeURIComponent(escape(window.atob(base64)));
      const data = JSON.parse(jsonStr);

      if (data) {
        let hasData = false;

        if (data.db) {
          document.getElementById('ctx-db').textContent = data.db;
          document.getElementById('row-db').classList.remove('d-none');
          hasData = true;
        }

        if (data.type) {
          document.getElementById('ctx-type').textContent = data.type;
          document.getElementById('row-type').classList.remove('d-none');
          hasData = true;
        }

        if (data.severity) {
          const severityBadge = document.getElementById('ctx-severity');
          const severity = data.severity.toLowerCase();
          severityBadge.textContent = severity.toUpperCase();
          if (severity === 'critical') {
            severityBadge.className = 'badge bg-danger';
          } else if (severity === 'warning') {
            severityBadge.className = 'badge bg-warning text-dark';
          } else {
            severityBadge.className = 'badge bg-info';
          }
          document.getElementById('row-severity').classList.remove('d-none');
          hasData = true;
        }

        if (data.t) {
          const date = new Date(data.t * 1000);
          document.getElementById('ctx-time').textContent = date.toLocaleString();
          document.getElementById('row-time').classList.remove('d-none');
          hasData = true;
        }

        if (data.details) {
          document.getElementById('ctx-details').textContent = data.details;

          
          const labelDetails = document.getElementById('label-details');
          if (data.type === 'object') {
            labelDetails.textContent = 'Object Metadata Details:';
          } else if (data.type === 'report') {
            labelDetails.textContent = 'Report Description:';
          } else {
            labelDetails.textContent = 'Firing Context:';
          }

          document.getElementById('row-details').classList.remove('d-none');
          hasData = true;
        }

        if (hasData) {
          document.getElementById('pslens-context-panel').classList.remove('d-none');
        }
      }
    } catch (e) {
      console.error('Failed to parse operational context metadata:', e);
    }
  })();
</script>


## User Full Access Report

**Report ID:** `security-user-access`
**Category:** Security
**Parameters:** `oprid` (required) — the PeopleSoft User ID to audit

## Purpose

This report generates a consolidated view of everything a single PeopleSoft user can access. It expands all roles and permission lists to show the full scope of a user's security profile in one document. This is useful for security audits, access reviews, onboarding/offboarding verification, and compliance reporting.

## What It Covers

The report walks the full PeopleSoft security hierarchy for the specified user:

1. **User Details**. Account status, authentication method, direct permission list assignments
2. **Roles**. All roles assigned to the user (including dynamic roles)
3. **Permission Lists**. Unique permission lists derived from assigned roles, with a reverse map showing which roles grant each
4. **PeopleTools Access**. Client tool access (Application Designer, Data Mover, etc.)
5. **Menu/Component Access**. All menu authorizations grouped by menu, showing components and display-only status
6. **Service Operations**. All authorized Integration Broker service operations
7. **Component Interfaces**. All authorized component interfaces
8. **Process Groups**. Authorized process scheduler groups
9. **Query Tree / Row-Level Security**. Accessible records via query tree security

## Tables Queried

|          Table          |               Purpose               |
| ----------------------- | ----------------------------------- |
| PSOPRDEFN               | User definition and account details |
| PSROLEUSER              | User-to-role assignments            |
| PSROLECLASS             | Role-to-permission-list mapping     |
| PSCLASSDEFN             | Permission list definitions         |
| PSAUTHITEM + PSMENUITEM | Menu/component authorizations       |
| PSAUTHWS                | Service operation authorizations    |
| PSAUTHBUSCOMP           | Component interface authorizations  |
| PSAUTHPRCS              | Process group authorizations        |
| SCRTY_ACC_GRP           | Query tree security access groups   |
| PSTREENODE              | Query tree node hierarchy           |

## Data Flow

```text
1. Fetch user details from PSOPRDEFN
        |
        v
2. Fetch all roles from PSROLEUSER
        |
        v
3. Batch-fetch permission lists for all roles
   from PSROLECLASS
        |
        v
4. Collect unique permission list ClassIDs
        |
        v
5. For ALL unique ClassIDs, fetch:
   - PeopleTools access (PSAUTHITEM special entries)
   - Menu authorizations (PSAUTHITEM + PSMENUITEM)
   - Service operation auths (PSAUTHWS)
   - Component interface auths (PSAUTHBUSCOMP)
   - Process group auths (PSAUTHPRCS)
   - Query tree access groups (SCRTY_ACC_GRP)
        |
        v
6. For query trees: walk tree hierarchy to
   resolve accessible leaf records
        |
        v
7. Generate consolidated Markdown report
```

## How to Run

This report can be launched in two ways:

1. **From the User Detail Page:** Navigate to any user's detail page and click the **Run Full Access Report** button in the right sidebar. The report automatically uses the current user and database.

2. **From the Reports Page:** Go to Reports > Run New Report > User Full Access Report. Enter the OPRID manually.

## Report Output

The generated report contains:

- **Summary table** with counts for each access category
- **User Details** with account status, authentication, and direct permission lists
- **Roles table** with dynamic assignment indicators
- **Permission Lists table** showing which roles grant each permission list
- **PeopleTools Access table** showing Yes/No for each client tool
- **Menu/Component Access** grouped by menu name, with component links, labels, and display-only flags
- **Service Operations table** with operation and permission list links
- **Component Interfaces table** with interface and permission list links
- **Process Groups table** listing authorized process groups
- **Query Tree tables** showing accessible records with tree and access group context

All object names in the report are linked back to their detail pages in psLens for easy navigation.

## Interpreting Results

- **Large number of roles:** Users with many roles may have accumulated access over time. Review whether all roles are still needed.
- **Overlapping permission lists:** Multiple roles may grant the same permission list. While not harmful, it can make access reviews harder.
- **PeopleTools access:** Application Designer, Data Mover, and Object Security access should be limited to developers and security administrators.
- **Display-only flags:** Components marked as display-only mean the user can view but not modify data through those pages.
- **Process groups:** Verify that users only have access to process groups relevant to their job function.
