In the last chapter, we built forms and detail pages — our ticket system can now handle data entry and viewing. But there's a problem: everyone sees the same thing after logging in. Regular employees who submit tickets can access the admin pages, technicians can delete categories... that's not going to work.
In this chapter, we'll add "access control" to the system: different people see different menus and operate on different data.
In NocoBase, a role is a collection of permissions. You don't need to configure permissions for each user individually — instead, you define a few roles first, then assign users to the appropriate roles.
NocoBase comes with three built-in roles after installation:
But these three built-in roles aren't enough for our needs. Our ticket system requires finer-grained control, so we'll create 3 custom roles next.
Open the settings menu in the top-right corner and go to Users & Permissions -> Roles.
Click Add role and create the following roles one by one:
| Role Name | Role Key | Description |
|---|---|---|
| HelpDesk Admin | admin-helpdesk | Can see all tickets, manage categories, assign handlers |
| Technician | technician | Can only see tickets assigned to them, can process and close |
| Regular User | user | Can only submit tickets and view their own submissions |

The Role Key is a unique internal ID used by the system. It cannot be changed after creation, so we recommend using lowercase English. The Role Name can be modified at any time.

After creation, you should see our three new roles in the roles list.
Now that the roles are set up, we need to tell the system which menus each role can access.
Click on a role to enter its permission configuration page, and find the Menu permissions tab. This lists all menu items in the system — check a box to allow access, uncheck it to hide it.
HelpDesk Admin (admin-helpdesk): Check all
Technician (technician): Partial access
Regular User (user): Minimum permissions

Tip: NocoBase has a handy setting — "Allow access to new menu items by default." If you don't want to manually check every new page you add, you can enable this for the admin role. For the regular user role, we recommend keeping it disabled.
Menu permissions control "can I access this page?" while data permissions control "what data can I see once I'm on the page?"
Key concept: Data Scope.
In the role's permission settings, switch to the Action permissions tab. Find our "Tickets" collection and click to configure it individually.

Similarly, set the "Edit" and "Delete" permissions to Own records as well (or simply don't grant delete permission at all).

About global configuration: if you only configure the Tickets collection, other data and settings (like categories, assignees) may become invisible. Since our system is fairly simple, we'll check "View all data" globally for now, and only set specific data scopes for sensitive collections.


Practical tip: You can also set default filter conditions on table blocks to assist permission control, e.g., "Assignee = Current user." But note that page configuration applies globally — admins would be limited too. A compromise: configure "Assignee = Current user or Submitter = Current user" to cover both regular users and technicians; if admins need a full view, create a separate page without filter conditions.

For the admin role, set the data scope to All records and enable all operations. Simple and straightforward.

Before testing permissions, let's add a handy feature to the ticket list: assigning a handler. Admins can assign a ticket to a technician directly from the list, without opening the full edit form and dealing with a bunch of fields.
The implementation is simple — add a custom popup button to the table row actions:


Since there's only a simple assignment to make, a compact dialog is more appropriate than a drawer. Click the popup settings in the button's top-right corner, select Dialog (narrow) > Confirm.


Now admins can click "Assign" in the ticket list, pick a handler from a minimal form, and submit. Quick, precise, and no risk of accidentally changing other fields.
The "Assign" button is only needed by admins — showing it to regular users and technicians would be confusing. We can use linkage rules to show or hide the button based on the current user's role:
This way, only users with the admin role can see the "Assign" button — it's automatically hidden for all other roles.

Permissions are configured — let's verify them in practice.
Go to User Management (in the settings center or the user management page you built earlier) and create 3 test users:
| Username | Role |
|---|---|
| Alice | HelpDesk Admin (admin-helpdesk) |
| Bob | Technician (technician) |
| Charlie | Regular User (user) |

After creating them, log in with each account and check two things:
1. Are the menus displayed as expected?



2. Is the data filtered as expected?
Pretty cool, right? The same system, completely different content for different users! That's the power of permissions.
In this chapter, we completed the ticket system's permission framework:
At this point, our ticket system is shaping up nicely — it can handle data entry, viewing, and role-based access control. But everything is still manual.
In the next chapter, we'll learn about Workflows — letting the system do work for us automatically. For example, automatically notifying the assignee when a ticket is submitted, or logging a timestamp when the status changes.