Динамическая авторизация ролей в Rails с использованием базы данных. Декларативная авторизация лучший выбор?
Мне нужно будет предоставить динамические назначения ролей (роли / привилегии) . Совершенно очевидно, что конечный пользователь должен иметь возможность создавать роль, назначать разрешения новому пользователю. Поэтому я думал о сохранении ролей и привилегий в таблице для каждого пользователя.
Есть ли умный способ сделать это (любой другой плагин?), Или я должен написать код, чтобы сделать это с помощью декларативной авторизации. Некоторый свет поможет. Спасибо!
3 ответа
Попробуйте ответить на них, чтобы приблизиться к решению:
- Являются ли сами роли динамичными? т.е. могут ли привилегии, назначенные различным ролям, быть изменены администратором через веб-интерфейс? Если да, то вы должны хранить эту информацию в своей базе данных. Для такой системы, как блог, где роли предварительно определены, например. Админ, Гость и Модератор, Декларативная авторизация работает как шарм.
- Насколько сильна связь разрешений с пользовательским интерфейсом? (Иногда нужно ограничить пару мест, в других случаях, например, в социальной сети, разрешения намного сложнее и тесно связаны с пользовательским интерфейсом). Если оно очень тесно связано, то есть одно действие доступно для всех видов ролей, но действия, выполняемые этими ролями, ограничены их определением, то Декларативная авторизация (или подобные им) не сильно поможет, вам нужна устаревшая система.
Cancan отлично подходит для простых / начинающих проектов, но вы обязательно должны обернуть его, если у вас есть монолитное приложение. Канкан должен быть ранним решением, но не окончательным. Если вы смотрите на объекты политики (pundit), это может быть запахом кода, вам нужно создать собственную модель авторизации. Авторизация, такая как интеграция, варьируется от клиента к клиенту, и если вы ищете более динамичные решения или у вас слишком много ролей, то cancan не для вас. Вам может понадобиться модель безопасности, основанная на данных. Например, если вы можете предоставить кому-то еще доступ к объекту.
Я недавно использовал 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