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

Хабравчане,

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

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

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

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

Есть идеи?
  • Вопрос задан
  • 4128 просмотров
Решения вопроса 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
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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