У "задать привилегии" есть общепринятое название - access control list (ACL).
Есть множество алгоритмов/имплементаций ACL, в зависимости от задач. Так например можно раздавать доступ к действию (как в вашем вопросе), или к данным (построчно в таблице, во всем известном контакте можно задавать привилегии к просмотру объекта группам, отдельным пользователям, комбинации групп пользователей; или же запрещать).
Сложности при реализации различных моделей:
- гибкая структура данных для хранения привилегий
- разрешение конфликтов
- производительность
Часто бывает что пользователь принадлежит к нескольким группам, одной группе разшен доступ, а другой - запрещен. Если привилегии хранятся в базе данных, бывает что на проверку привилегий уходит больше запросов чем на само действие/данные. К тому же кэширование привилегий не всегда возможный вариант.