> ## Documentation Index
> Fetch the complete documentation index at: https://docs.shdevelopment.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Managing ACE Permissions for SH Development Scripts

> SH Development scripts gate sensitive features behind FiveM ACE permissions. Learn how to assign permission nodes and manage access in server.cfg.

SH Development scripts use FiveM's built-in ACE (Access Control Entries) system to restrict sensitive features — such as admin menus, vehicle spawners, and citation tools — to authorized players only. ACE gives you fine-grained control directly from `server.cfg`, with no external permission plugin required. Understanding how to add and assign these entries is essential for any server running SH Development resources.

## How ACE Permissions Work

ACE permissions operate on two concepts: **principals** (players or groups) and **objects** (permission nodes). You grant a principal access to an object with an `allow` rule, and you can revoke it with a `deny` rule. FiveM evaluates these rules at runtime whenever a script calls `IsPlayerAceAllowed`.

## Granting Permissions to a Group

The most common pattern is to allow an entire staff group to use a feature. Add `add_ace` lines to your `server.cfg`:

```cfg server.cfg theme={null}
add_ace group.admin sh.citation allow
add_ace group.police sh.citation allow

add_ace group.admin vehiclespawner.open allow
add_ace group.admin vehiclespawner.all allow
```

Each line follows the format: `add_ace <principal> <object> <allow|deny>`.

## Assigning Players to Groups

To place a player into a group, add an `add_principal` line using one of their identifiers:

```cfg server.cfg theme={null}
add_principal identifier.steam:110000112345678 group.admin
```

You can use any FiveM identifier type — `steam`, `license`, `discord`, or `fivem` — as long as it uniquely identifies the player.

## Permission Nodes by Script

The table below lists the ACE nodes used by each SH Development script that implements permission checks.

| Script            | ACE Node                    | What it gates                                          |
| ----------------- | --------------------------- | ------------------------------------------------------ |
| sh-citation       | `sh.citation`               | Opens the citation and traffic ticket UI               |
| sh-vehiclespawner | `vehiclespawner.open`       | Opens the vehicle spawner menu                         |
| sh-vehiclespawner | `vehiclespawner.all`        | Grants access to every vehicle category                |
| sh-vehiclespawner | `vehiclespawner.<category>` | Grants access to a single named category               |
| sh-golf           | `golf`*(configurable)*      | Allows use of the `/golf` command                      |
| sh-reports        | `admin`*(configurable)*     | Delivers in-game alerts when a new report is submitted |

<Note>
  The node name listed in `config.lua` is the one the script actually checks. Some scripts let you rename the ACE node via a config option — always verify the node name in `config.lua` before adding it to `server.cfg`.
</Note>

## Disabling Permission Checks

If you want a feature to be available to all players without any ACE gating, you can turn off the check in `config.lua`. The exact key name varies by script:

```lua config.lua theme={null}
Config.EnablePermissions = false  -- sh-vehiclespawner and others
-- or
Config.AcePerm = false            -- sh-citation
```

<Warning>
  Disabling permission checks is **not recommended for production servers**. It makes restricted features available to every connected player, including public users. Only disable checks during local testing or on private whitelisted servers where all players are trusted.
</Warning>

## Tips for Managing Permissions

<Tabs>
  <Tab title="Multiple groups, one node">
    You can grant the same node to multiple groups by adding one `add_ace` line per group:

    ```cfg server.cfg theme={null}
    add_ace group.admin sh.citation allow
    add_ace group.moderator sh.citation allow
    add_ace group.police sh.citation allow
    ```
  </Tab>

  <Tab title="Revoking access">
    Use `deny` to explicitly block a principal from a node, even if they inherit it through a group:

    ```cfg server.cfg theme={null}
    add_ace identifier.steam:110000112345678 vehiclespawner.all deny
    ```
  </Tab>

  <Tab title="Category-level spawner access">
    Grant a group access only to specific vehicle categories rather than everything:

    ```cfg server.cfg theme={null}
    add_ace group.police vehiclespawner.open allow
    add_ace group.police vehiclespawner.emergency allow
    ```
  </Tab>
</Tabs>
