2012-01-28 3 views
0

Я пытаюсь реализовать службу с публичным api, который имеет шаблон управления доступом, очень похожий на график facebook api. Я использую драгоценный камень привратника, который позволяет мне делать OAuth с помощью Devise, а также легко предоставить разрешениям/областям доступ к токенам.Как сделать (oauth-) контроль доступа на основе ролей для Rails?

Так за что, я должен был бы: - контроль доступа на основе объема маркера доступа - контроля доступа для пользователей различных групп на платформе (например, настройки конфиденциальности на Facebook) - контроль доступа должен быть динамичным , can not предполагают фиксированные роли

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

Есть ли у вас какие-либо другие предложения?

+0

Как насчет CanCan не удовлетворяет ваши потребности? Я не знаком с OAuth, но я не могу придумать, почему это не сработает. – Max

+0

Насколько я видел из своих исследований, CanCan охвачен очень традиционным RBAC. Мне нужна динамическая область видимости для всех пользователей, поэтому я не могу поместить их в группы (по крайней мере, это мое понимание cancan) – nambrot

+0

Я немного не уверен, что подразумевается под «динамическим охватом». – Max

ответ

0

Я думаю, что CanCan может обрабатывать то, что вы хотите. Поскольку вы не указали специфику того, что считает авторизованным пользователем, я покажу вам некоторые методы, которые, я думаю, будут полезны. Первое, что я скажу, это то, что вы можете передать любые объекты, которые вы хотите в свой файл возможностей. Для этого выполните следующее:

def ApplicationController < ActionController::Base 
    def current_ability 
    @current_ability = CustomAbility.new(pass, in, anything, here) 
    end 
end 

В приложении/модели вы когда определить custom_ability.rb:

def CustomAbility 
    include CanCan::Ability 

    def initialize(anything, you, want, here) 
    ... 
    end 
end 

В этом случае что-нибудь = передать, вы = в, хочу = ничего , здесь = здесь. Кроме того, вы можете вызвать некоторые методы на ресурсе, который вы авторизуете. CanCan работает, загружая @resource_name и затем вводя файл способности для авторизации. Он загружает @resource_name, предполагая маршруты RESTful, но вы можете легко использовать файл before_filter для загрузки своего собственного ресурса, если вы храните его в @resource_name (т. Е. Сохраняете пользователя в @user).

Вы также можете вызвать определенные методы для объекта, на который вы авторизуете уже созданные параметры. Например, вы можете захотеть сделать что-то вроде этого:

def initialize(user) 
    can :read, Post do |post| 
    !((post.readable_groups & user.groups).empty?) 
    end 
end 

В принципе, если строка в этом блоке возвращает ложь, то вы становитесь несанкционированным. Единственное предостережение в том, что блок не выполняется для создания или нового. Есть способы обойти это. Например, скажем, вы применяли одно сообщение для каждого пользователя на уровне модели с проверками уникальности. Вы можете использовать фильтр перед загрузкой сообщения, задав user_id, а затем сделать

can :create, Post, valid?: true 

В любом случае, надеюсь, что это поможет.

+0

Я предполагаю, что единственный вопрос, который у меня возникнет: Как я могу сделать определенные атрибуты Post видимыми в зависимости от аргументов, которые я передаю для инициализации? например, я хочу, чтобы админы могли видеть все данные, но гости только просматривают выдержку из сообщения, например? – nambrot

+0

Обычно действия в CanCan соответствуют действиям контроллера, хотя я считаю, что можно произвольно определять действия. Например, я думаю, вы можете добавить что-то вроде этого: 'can: read_part, Post # Hash или блок условий здесь ', а затем, по вашему мнению, вы можете сказать' <% if can? (: Read_part, @post)%> 'и т. д. – Max

Смежные вопросы