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

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

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

Ответы [ 3 ]

1 голос
/ 23 августа 2010

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

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

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
1 голос
/ 29 декабря 2014

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

1 голос
/ 23 августа 2010

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

  1. Динамичны ли сами роли?т.е. могут ли привилегии, назначенные различным ролям, быть изменены через веб-интерфейс администратором?Если да, то вы должны хранить эту информацию в своей базе данных.Для такой системы, как блог, где роли предварительно определены, например.Админ, Гость и Модератор, Декларативная авторизация работает как шарм.
  2. Насколько сильна связь разрешений с пользовательским интерфейсом?(Иногда нужно ограничить лишь пару мест, в других случаях, например, в социальной сети, разрешения намного сложнее и тесно связаны с пользовательским интерфейсом).Если оно очень тесно связано, то есть одно действие доступно для всех видов ролей, но действия, выполняемые этими ролями, ограничены их определением, то Декларативная авторизация (или подобные) не сильно поможет, вам нужна устаревшая система.
...