Как сделать (oauth-) контроль доступа на основе ролей для Rails? - PullRequest
0 голосов
/ 28 января 2012

Я пытаюсь реализовать сервис с общедоступным API, шаблон управления доступом которого очень похож на API Graphs Facebook. Я использую самоцвет привратника, который позволяет мне выполнять OAuth с Devise, а также легко назначать разрешения / области для доступа к токенам.

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

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

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

1 Ответ

0 голосов
/ 28 января 2012

Я думаю, 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

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

can :create, Post, valid?: true

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...