Start from jobs, not people
Access set person by person drifts. One clerk is given a little more to cover a holiday, nobody takes it back, and a year later nobody can say why the van driver can approve credit notes. Design access around jobs instead: write down each job, decide what it needs, and give each person the role of their job.
Most distributors need fewer jobs than they expect: sales clerk, collector, warehouse keeper, buyer, accountant, field supervisor, branch manager and owner. A person who really does two jobs gets one role built for the pair and named for it, rather than a pile of exceptions.
TipName each role after the job, such as warehouse keeper, never after a person, so it survives staff changes.
Give each job a level in each area
For every job, go area by area through the system: customers, sales orders, invoices, payments, stock, purchasing, the ledger and settings. For each, decide the least the job needs: nothing, view, create, edit, full control or approve. Each level should include the ones below it, so granting edit already allows view and create.
Err on the low side. Someone who finds they cannot do part of their job will ask within a day; someone with too much access will never mention it.
Keep approval apart from entry
The simplest control in any company is that the person who enters a transaction is not the one who approves it. The clerk who raises a purchase order should not release it; the rep who sells on credit should not lift the customer’s credit hold; the cashier who counts the till should not approve the shift.
Treat approve as a separate level, granted only to the few who need it, and check each role for pairs of rights that should not sit together.
- Raising and approving purchase orders.
- Entering vendor bills and paying them.
- Selling on credit and releasing credit holds.
- Counting cash and approving the count.
- Changing prices and approving discounts above the ceiling.
- Creating users and granting them roles.
TipIn a small company where one person must do both, keep the right, but have the owner read a weekly list of what that person approved.
Build, test, then assign
Build each role once, with the levels you agreed, then try it before anyone relies on it. Sign in as a test user with that role and walk through a normal day of that job. Every refusal you hit is a missing grant; every screen you can change but should not is a grant to remove.
- Write the role on paper: job name and level per area.
- Create the role and set its levels.
- Give it to a test user and work through a day of that job.
- Fix what was missing or too wide.
- Assign the role to everyone in that job.
- Keep the paper version as the record of what was agreed.
A hidden button is not a lock
Many systems control access by hiding menus. That keeps screens tidy, but it is not protection: anyone who finds the address of a hidden page, or sends a request from outside the screen, may still get through. The rule must be checked where the data lives, on the server, every time a record is read or saved.
When you test a role, try the actions it should not do and confirm they are refused, not only that the button has gone. A screen that shows a record read-only, rather than hiding it, also tells the user why they cannot change it.
Review access when people move
Access goes wrong at the moments people join, change job or leave. Make each of those moments trigger a change: a new starter gets the role of their job on day one, a person who moves gets the new role the same day, and a leaver is deactivated before they walk out.
Once a quarter, list every user with their role and have each manager confirm their team. Look hardest at anyone who can approve, pay or change settings.
TipRequire two-step sign-in for everyone who can approve or pay, since a stolen password there costs the most.
Checklist: Roles and permissions checklist
- List the jobs in the company, not the people
- Set the least level each job needs in each area
- Name roles after jobs
- Keep approving apart from entering
- Test each role with a test user before assigning it
- Check that forbidden actions are refused, not just hidden
- Change roles the day someone moves or leaves
- Review every user’s role once a quarter
- Require two-step sign-in for approvers and payers