Как в ролевой модели (User — Roles) реализовать бан?
Вы - описали роли пользователя.
Хотите - создать роли ACL (access level system), понижающие действующие привелегии.
Сначала создайте ACL под все роли пользователей, что Вы описали (USER_ACL, MODERATOR_ACL и т.д.). Это таблица с привелегиями (битовая "маска" со степенями двойки): 1,2,4,8,16,32,64 и т.д. Сумма этих значений даёт число, однозначно определяющее ACL для доступа к различным функциям.
Затем - создайте различные BAN-наборы (ACL по тем же кретериям).
BAN_CHAT, BAN_EDIT, BAN_DELETE, BAN_REOWNER и т.д.
И из действующего *_ACL вычитаете BAN_*.
Полученное - и будет действующие ACL, но с ограничениями по BAN-маске.
(меньше или равно 0 - значит вообще без каких-либо прав)
я обычно в БД делал для домашнего проекта столбик "ban_level" и туда вписывал цифру в зависимости от уровня ограничений человеку. И в коде это уже обрабатывалось.
1 - мут чата, 2 - блокировка аккаунта, 3 - сбросьте пароль и т.д.
Потом через пару лет сделал такой подход: каждому пользователю создавался столбик с restrictions, изначально пустой, по мере нарушений я в json виде записывал туда строку с ограничениями (поскольку невозможно было разделить на уровни ограничений. можно было только ограничить разные конкретные действия). Потом каждый раз доставал из базы - и проверял - есть ли ограничение или нет на текущее действие,
{"restrictions": { "chat", "levelup", "teleport"}}