Как в ролевой модели (User — Roles) реализовать бан?

У меня реализованы пользователи, которые имеют некоторые роли
При регистрации пользователь автоматически получает роль ROLE_USER
Ему можно установить ROLE_ADMIN, ROLE_MODERATOR и т.д.

Но я хочу релизовать бан и не совсем понимаю как это делается,
суть бана в запрете некоторых действий, например написать сообщение, поставить + под сообщением и т.д
Это нужно добавлять ROLE_BAN и проверять каждый раз? Или нужно убрать ROLE_USER?

Баны тоже предполагаются в несколько уровней, чем выше уровень бана, тем больше действий будет запрещено.

Как обычно реализуется бан в таких случаях?
  • Вопрос задан
  • 234 просмотра
Решения вопроса 1
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Вы - описали роли пользователя.
Хотите - создать роли 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 - значит вообще без каких-либо прав)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@zvonok1337
я обычно в БД делал для домашнего проекта столбик "ban_level" и туда вписывал цифру в зависимости от уровня ограничений человеку. И в коде это уже обрабатывалось.
1 - мут чата, 2 - блокировка аккаунта, 3 - сбросьте пароль и т.д.

Потом через пару лет сделал такой подход: каждому пользователю создавался столбик с restrictions, изначально пустой, по мере нарушений я в json виде записывал туда строку с ограничениями (поскольку невозможно было разделить на уровни ограничений. можно было только ограничить разные конкретные действия). Потом каждый раз доставал из базы - и проверял - есть ли ограничение или нет на текущее действие,
{"restrictions": { "chat", "levelup", "teleport"}}
Ответ написан
Комментировать
twobomb
@twobomb
Как вариант сделать какую нибудь отдельную таблицу типа
permission в ней будут права, типа право поставить +, право редактировать сообщение... Отношение таблицы user к permission многие ко многим. И таким образом мы можем каждому пользователю выдавать любые права. При регистрации по дефолту давать права на редактрование, добавление сообщения и т.п. Или можно все развенуть в обратную строну. Все права что добавлены значит запрещены, все что не добавлены разрешены. Ну и можно еще отдельно придумать что например у юзера с ROLE_USER должны игнорироваться значения прав например сменить роль пользователю, забанить пользоваля (права админа)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы