Динамическая авторизация ролей в Rails с использованием базы данных. Декларативная авторизация - лучший выбор?

Мне нужно будет предоставить динамическое назначение ролей (Роли / Привилегии). Более того, конечный пользователь должен иметь возможность создавать роль, назначать разрешения новому пользователю. Итак, я подумал о хранении ролей и привилегий в таблице для каждого пользователя.

Есть ли умный способ сделать это (любой другой плагин?), Или я должен написать код для этого с декларативной авторизацией. Немного света поможет. Спасибо!


person Shreyas    schedule 23.08.2010    source источник


Ответы (3)


Попробуйте ответить на эти вопросы, чтобы приблизиться к решению:

  1. Сами ли роли динамичны? т.е. могут ли привилегии, назначенные различным ролям, быть изменены через веб-интерфейс администратором? Если да, то вам следует сохранить эту информацию в своей базе данных. Для такой системы, как блог, где роли заранее определены, например. Администратор, Гость и Модератор, декларативная авторизация работает как шарм.
  2. Насколько сильна привязка разрешений к пользовательскому интерфейсу? (Иногда это всего лишь пара мест, которые вам нужно ограничить, в других случаях, например, в социальной сети, разрешения намного сложнее и тесно связаны с пользовательским интерфейсом). Если он очень тесно связан, то есть одно действие доступно для всех видов ролей, но действия, выполняемые этими ролями, ограничены их определением, тогда декларативная авторизация (или тому подобное) не сильно поможет, вам нужна устаревшая система.
person Swanand    schedule 23.08.2010
comment
Я знаю, что это действительно старая система, но не могли бы вы расширить ее, имея в виду устаревшую систему? - person Eric Hu; 07.01.2012
comment
Под устаревшей системой я имею в виду базу кода или набор правил, специфичных для платформы, которую создает OP. Например, в одном из наших продуктов есть DispatchManager, AccountContact и SalesExecutive, каждый из которых имеет разные привилегии и роли в разных частях приложения. Так что систему правил, которую я построил для этого, можно было бы назвать устаревшей системой. - person Swanand; 07.01.2012

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

Я взял весь этот пример кода из readme на github:

class Ability
  include CanCan::Ability

  def initialize(user)
    if user.admin?
      can :manage, :all
    else
      can :read, :all
    end
  end
end

Затем в ваших представлениях и вашем контроллере вы можете проверить уровни авторизации

<% if can? :update, @article %>
  <%= link_to "Edit", edit_article_path(@article) %>
<% end %>


def show
  @article = Article.find(params[:id])
  authorize! :read, @article
end
person Jesse Wolgamott    schedule 23.08.2010

Cancan отлично подходит для простых / начинающих проектов, но вам обязательно стоит обернуть его, если у вас монолитное приложение. Канкан должен быть первым решением, но не окончательным. Если вы смотрите на объекты политики (эксперт), это может быть запах кода, который вам нужен для создания собственной модели авторизации. Авторизация, такая как интеграция, варьируется от клиента к клиенту, и если вы ищете более динамичные решения или у вас слишком много ролей, о которых стоит говорить, cancan не для вас. Возможно, вам понадобится модель безопасности, основанная на данных. Например, если вы можете предоставить кому-то еще доступ к объекту.

person Cohesive jones    schedule 29.12.2014