несколько условий для пользователя в декларативном_авторизации if_attribute - PullRequest
1 голос
/ 28 апреля 2011

у меня 4 разных уровня доступа; Администратор, партнер, сотрудник и клиент. Администратор, Партнер и Сотрудник имеют административный доступ к клиентам. По сути, я создал приложение Rails, где клиенты могут загружать документы своему поставщику (партнерам). Все отлично работает, кроме доступа на уровне клиента. У меня есть два кода; Партер-код и код клиента. Партнеры могут видеть только те файлы, в которых поле партера имеет равное коду партнера. Это работает просто отлично. Однако клиент может видеть только файлы, в которых совпадает код партнера и совпадает код клиента. Ниже мой клиентский раздел. Что работает, так это то, что клиенту разрешено видеть только файлы партера, но он настраивает их на просмотр других клиентов, принадлежащих партнеру (введя номер в URL). Я сомневаюсь, что это когда-нибудь станет проблемой, но это дыра в безопасности, которую я бы точно хотел закрыть.

  role :client do
    has_permission_on [:users], :to => [:client, :edit, :update] do
      if_attribute :username => is { user.username }
    end
     has_permission_on [:documents], :to => [:client, :new, :create]
     has_permission_on [:documents], :to => [:client, :index, :show, :edit, :update, :destroy, :documents] do
       if_attribute :partnercode => is { user.partnercode }, :clientcode => is { user.clientcode }
     end
  end

Ответы [ 3 ]

3 голосов
/ 01 июня 2012

Я не думаю, что вложение операторов if_attribute на самом деле работает так.Declarative_authorization по умолчанию объединяет эти операторы if_attribute с оператором or, но если я правильно понимаю, вы хотите, чтобы они были объединены с and.Чтобы изменить это, нужно установить для атрибута :join_by значение :and.

role :client do
  has_permission_on [:documents], :to => [:do_whatever], :join_by => :and do
    if_attribute :partnercode => is { user.partnercode }
    if_attribute :clientcode => is { user.clientcode }
  end
end

source: http://www.tzi.org/~sbartsch/declarative_authorization/master/classes/Authorization/Reader/AuthorizationRulesReader.html#M000184

0 голосов
/ 17 декабря 2012

:join_by работает, но моя проблема в том, что иногда вам нужны и AND, и OR. Вы можете указать несколько условий if в одной строке в качестве разных аргументов. Они будут сравниваться вместе с использованием AND, тогда как каждая строка оценивается с помощью OR.

role :client do
  has_permission_on [:documents], :to => [:do_whatever], :join_by => :and do
    if_attribute :partnercode => is { user.partnercode }, 
                 :clientcode => is { user.clientcode } # These two are evaluated with AND
    if_attribute :some_attr => is { some_val }
  end
end
0 голосов
/ 28 апреля 2011

Я нашел ответ. По иронии судьбы, ответ был в тегах этого вопроса; вложенная.

  role :client do
    has_permission_on [:users], :to => [:client, :edit, :update] do
      if_attribute :username => is { user.username }
    end
     has_permission_on [:documents], :to => [:client, :new, :create]
     has_permission_on [:documents], :to => [:client, :index, :show, :edit, :update, :destroy, :documents] do
       if_attribute :clientcode => is { user.clientcode } do
        if_attribute :partnercode => is { user.partnercode }
       end
     end
  end

Как только я проверю правильность кода клиента, создайте еще один конец do .. для проверки кода партнера.

...