Какие есть варианты управления доступом на основе членства в группах в Rails? - PullRequest
0 голосов
/ 04 декабря 2011

Для Rails я вижу довольно много вариантов гемов для управления доступом на основе ролей (cancan, cantango и т. Д.). Однако я не нахожу никаких гемов для контроля доступа на основе членства в группах. Вот упрощенное описание того, что я пытаюсь выполнить:

Users: a, b, c, d 
Groups: y, z
Group Membership: y has a and b; z has c and d
Posts: m, n
Ownership: a owns m; c owns n

Group y is marked as a public group. m can be seen by all users
Group z is marked as a private group.  n can only be seen by c and d

Так что ничего особенного или сложного, по сути, возможности, похожей на управление доступом к файловой системе (например, чтение-запись-выполнение через владельца-группы-public [без 'execute', конечно].)

Похоже, что Radiant (с некоторыми дополнительными плагинами) может обеспечить контроль доступа к членству в группах на уровне страницы, но мне не нужна / не нужна целая CMS, и я бы предпочел что-то на основе модели (например, cancan). ) против страницы / пути. (Кстати, я использую Devise для своей пользовательской модели - что-то в Devise я пропустил?)

Как группируются частные / публичные группы пользователей в Rails? Только через Rails на основе CMS? Я что-то упустил? Или этот вариант использования редко используется в сообществе Rails?

Ответы [ 2 ]

1 голос
/ 17 декабря 2011

Я нашел ответ на этот вопрос и подумал, что опубликую его на тот случай, если кто-то еще его ищет.

CanCan поддерживает групповые возможности через "Хэш условий". Идея состоит в том, что post помечается :group_id (belongs_to a group) и users has_many groups. Затем вы можете настроить «хэш условий» в операторе can следующим образом:

can :manage, Post, :group => { :id => user.group_ids }

«Хэш условий» документирован здесь:

https://github.com/ryanb/cancan/wiki/Defining-Abilities

Спасибо @Jason_Noble за то, что указал мне обратно на канкан документы, где я наконец нашел его.

p.s. одно замечание по реализации. Если вы хотите, чтобы некоторые сообщения были общедоступными, а некоторые сообщения частными, вы можете создать группу по умолчанию, членом которой является каждый пользователь. Все общедоступные сообщения должны быть помечены с помощью group_id по умолчанию.

0 голосов
/ 04 декабря 2011

Я бы использовал CanCan и сделал бы что-то вроде:

can :view_post, User if user.is_member_of_group?(z)
...