Гибкая система прав для сайта

Хабравчане,

Мне для проекта надо сделать систему разграничения доступа к контенту по стилю очень похожую на ВКонтакте. Т.е. у каждого «поста» (назовем так для упрощения) должны быть настройки вида: Видно только друзьям; Видно всем; Видно зарегистрированным; Видно следующим группам (кастомный выбор групп которые пользователь создал сам для себя из своих контактов).

Я крепко задумался как реализовать подобную вещь, чтобы когда я вытаскиваю «посты» из MySQL прямо в этом же запросе можно было наложить фильтр и вытаскивать только те «посты», которые доступны пользователю. Если бы не кастомные группы, то я думал в сторону маркеров типа:
Видно всем — 0
Видно зарегистрированным — 1
Видно друзьям — 2
Ну и соответственно для текущего пользователя предрассчитывать:
Зарегистрирован? +1 в индикатор.
А дальше на уровне SQL запроса определять дружбу с владельцем поста, и если друг, то делать еще +1 в индикатор.
А дальше накладывать фильтр вида WHERE post.access_level <= calculated_access_level

Но как в таком раскладе быть с кастомными группами — не понятно. На уровне инстинктов есть ощущение, что надо как-то завязываться на битовые маски, но оно ничем не находит свое подтверждение. Гугл помог не сильно.

Для меня ключевым является максимальная простота и скорость отбора «постов» в соответствии с установленным уровнем доступа.

Есть идеи?
  • Вопрос задан
  • 4127 просмотров
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
Решать такую задачу не приходилось, так что другие подходы пока не представляю. Я бы пошёл куда-то в эту сторону:

Таблица:
post_id, access_level, access_value

access_level — это ваши «только друзьям», «всем» и т.д. Сюда же входит пункт «перечисленным группам» (тип поля — enum для удобочитаемости)
Для access_level = 'перечисленные группы' заполняются значения access_value соответственно по id группы на строку. Сюда же хорошо ляжет фильтр «только таким-то пользователям»

Соответственно, выбираем видимые посты:
select post_id from posts_access where (access_level = 'groups' and 'access_value' in (группы этого юзера)) or access_level='all' — и далее условия
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
HEm
@HEm
php.russofile.ru/ru/translate/rights/phpgacl/ вот тут весьма популярным языком расписано про ACL
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
24 апр. 2024, в 22:11
2000 руб./за проект
24 апр. 2024, в 22:00
500 руб./в час
24 апр. 2024, в 21:49
10000 руб./за проект