Как настроить декларативную авторизацию для каждого пользователя - PullRequest
3 голосов
/ 23 декабря 2011

У меня есть две модели:

class Photo < ActiveRecord::Base
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :photos
end

и это значение declarative_authorization для роли:

  role :reg_ser do
     has_permission_on :photos, :to => [:show] do
       if_attribute :user_id => is { user.id }
     end
  end

, и я хочу разрешить отображение пользователю изображения, котороеон загружает - только его изображения.Я имею в виду, например:

user_id | photo
      1 | 1
      1 | 2
      1 | 3
      2 | 4

И когда пользователь установит URL /photos/1, то это изображение будет отображаться только для user_id с номером 1, когда user_id=2 будетпоказать этот адрес, он не видит изображение ...

Возможно ли что-то подобное сделать?

1 Ответ

0 голосов
/ 14 марта 2012

Вам нужно поставить что-то вроде

filter_access_to [:index, :new, :create]
filter_access_to [:show, :edit, :update], :attribute_check => true

в вашем контроллере и что-то вроде

role :reg_ser do
  has_permission_on :photos, :to => [:index, :new, :create]
  has_permission_on :photos, :to => [:show, :edit: update] do
    if_attribute :user_id => is { user.id }
  end
end

в authorization_rules.rb. Таким образом, все работает правильно, важно, чтобы вы включали :attribute_check в контроллер для каждого действия, в котором вы хотите проверить атрибуты. Я оставил :index без него, так как довольно просто показать вещи текущего пользователя, добавив

def begin_of_association_chain
  current_user
end

или аналогичный контроллеру (это может привести к тому, что InheritedResources будет иметь current_user.pictures в качестве коллекции).

Вам также может быть интересно прочитать http://asciicasts.com/episodes/188-declarative-authorization

...