декларативные права доступа к ролям - PullRequest
3 голосов
/ 20 апреля 2010

Я пытаюсь добавить авторизацию в довольно большое приложение, которое уже существует, но мне нужно немного запутать детали.

Вот фон:

В нашем приложении есть иерархические номера или роли, примерно такие:

BasicUser -> SuperUser -> Admin -> SuperAdmin

Для авторизации каждый экземпляр модели пользователя имеет атрибут «роль», соответствующий приведенному выше.

У нас есть RESTful-контроллер «Пользователи», который расположен под Backoffice. Короче говоря, это Backoffice :: UsersController.

class Backoffice::UsersController < ApplicationController
  filter_access_to :all
  #... RESTful actions + some others
end

Так вот в чем проблема:

Мы хотим, чтобы пользователи могли предоставлять пользователям разрешения на редактирование пользователей, но ТОЛЬКО если они играют «меньшую» роль, чем в настоящее время. Я создал следующее в authorization_rules.rb

authorization do
  role :basic_user do
    has_permission_on :backoffice_users, :to => :index
  end
  role :super_user do
    includes :basic_user
    has_permission_on :backoffice_users, :to => :edit do
      if_attribute :role => is_in { %w(basic_user) }
    end
  end
  role :admin do
    includes :super_user
  end
  role :super_admin do
    includes :admin
  end
end

И, к сожалению, насколько я понял, похоже, что правило не применяется.

  1. Если я закомментирую правило, никто не сможет редактировать
  2. Если я оставлю правило, вы можете редактировать всех

Я также попробовал несколько вариантов if_attribute:

if_attribute :role => is { 'basic_user' }
if_attribute :role => 'basic_user'

и они получают тот же эффект. У кого-нибудь есть предложения?

Ответы [ 2 ]

4 голосов
/ 03 марта 2011

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

Подсказка заключается в том, что Declarative_authorization имеет отличный контроллер, который создает график, показывающий иерархию ваших ролей. Используя тот же код поддержки, который они имеют, вы можете легко получить доступ к предкам любой роли, таким образом:

class Role < ActiveRecord::Base
  require 'declarative_authorization/development_support/analyzer'

  has_many :assignments
  has_many :users, :through => :assignments

  validates :name, :presence => true
  validates :name, :uniqueness => true

  def ancestors
    Authorization::DevelopmentSupport::AnalyzerEngine::Role.for_sym(self.name.to_sym, 
      Authorization::Engine.instance).ancestors.map { |r| r.instance_variable_get("@role") }
  end

  def self_and_ancestors
    ancestors << self.name.to_sym
  end
end

Затем вы можете использовать это для таких вещей, как предлагать в редакторе пользователей только выбор ролей, которые совпадают или уступают роли current_user, а также запрещают доступ или не разрешают изменение в модели тому, кто пытается ненадлежащим образом продвигать пользователя , Это не так полезно в контексте самой декларации DSL с декларативной авторизацией, так как сначала ее нужно будет проанализировать, создавая некую циклическую ссылку.

Надеюсь, это поможет всем, кто в этом нуждается.

0 голосов
/ 18 мая 2010

У меня есть следующий подход в моем приложении, и он работает

role :super_user do
    includes :basic_user
    has_permission_on :backoffice_users do
      to :edit
      if_attribute :role => is {"basic_user"}
    end
end
...